Klasa ktora ma tylko statyczne metody , jak zwolnic utworzone obiekty Qt

0

Potrzebuje menu które działa trochę inaczej:
domyślnie jest niewidoczne , ale można je wyświetlić.

Klasa Menu0 ma wszystkie metody statyczne [koncept możliwe ze błędny]
Menu0 tworzy obiekt GUI (nowe okno z MENU) za pomocą "LAMBDA" w metodzie execute(...) [chciałem aby okno tworzyło się tylko wtedy gdy jest potrzebne]

Tylko że jest drobny problem bo te dodatkowe okno przechowywane w instance_menu_gui
nie ma wywołanego destruktora przy zamykaniu aplikacji bo ma ustawiony parent(nullptr)

Wiec się zastanawiam jak takie obiekty SIEROTY zwalniać

// klasa bazowa dla wizualizacji MENU (okno które zawiera menu i będzie rysowane tylko menu) 
typedef QMainWindow IMenu0_GUI;

// typ dla lambdy
typedef std::function<IMenu0_GUI*()> fu_create_Menu0_GUI;

// klasa do sterowania widocznością MENU
class Menu0  
{
private:
    inline static fu_create_Menu0_GUI create_Menu0_GUI{0};
    inline static IMenu0_GUI * instance_menu_gui{nullptr}; 
 pubic:   
    static void Close(void)
    {
        if(instance_menu_gui)
        {
            instance_menu_gui->close();
            instance_menu_gui->setParent(nullptr);
        }    
    }
    static bool Visible(void)
    static bool Execute(QWidget *parent)
    {
        if(create_Menu0_GUI) 
        {
            instance_menu_gui = create_Menu0_GUI();
        }   

        if(!instance_menu_gui) return false;

        instance_menu_gui->setParent(parent);
        ..... RESZTA 
    }
    ////////////////////////////////////////////// 
    static void RegisterMenu(fu_create_Menu0_GUI fu){
        create_Menu0_GUI = fu;
    }
}

kompletny kod https://github.com/mariuszmaximus/menu0

1
Adamek Adam napisał(a):

Potrzebuje menu które działa trochę inaczej:
domyślnie jest niewidoczne , ale można je wyświetlić.

Może trochę jaśniej o co chodzi. Chodzi ci o menu kontekstowe (takie wyskakujące pod prawym przyciskiem myszy)?

Adamek Adam napisał(a):
// klasa bazowa dla wizualizacji MENU (okno które zawiera menu i będzie rysowane tylko menu) 
typedef QMainWindow IMenu0_GUI;

Już samo połączanie nazw QMainWindow i IMenu0 wzbudza u mnie wielki niepokój.

Nie udziwniaj, wyjaśnij co chcesz uzyskać i czemu maszyneria Qt ci nie odpowiada.

0

Nie mam miejsca na ekranie na menu , ekran jest niewielki 800x480.
przenoszę pomysły już używane z Lazarus-a

Aplikacja sie uruchamia bez menu
Użytkownik na chwile potrzebuje menu wiec naciska przycisk na klawiaturze membranowej i wyświetlam menu , wybierze co trzeba i menu znika

Możliwe że z powodu małego doświadczenia z Qt wymyślam koło na nowo i na razie jestem na poziomie: image

Stara platforma: Lazarus na linux arm , interfejs GTK3 , wyświetlałem małe okno z menu przed głównym oknem aplikacji
Nowa platforma: c++ i Qt i do tego jeszcze Wayland ktory troche działa inaczej , nie rozumiem go i jeszcze nie został ujarzmiony

0

@MarekR22 Bardzo interesujący przykład !

Tylko się zastanawiam czy dobrze zrozumiałem, bo może jestem zafiksowany na jeden sposób myslenia i nie jestem otwarty na alternatywne rozwiazania
, sugerujesz aby wyświetlić menu jako "popup" ?

MainWindow ==glowne okno aplikacji (dziedziczy po QWidget)
WindowWithMenu == okno ktore posiada tylko menu i ma setWindowFlags(windowFlags() | Qt::Popup); (dziedziczy po QMainWindow bo nie umiem inaczej utworzyć menu)

void MainWindow::pokazMenu()
{
    QMenu menu(this);
    QPoint p =  mapToGlobal(QPoint(0, 0));
    WindowWithMenu *windowWithMenu = new WindowWithMenu(p,this);

    // [1] aby rozwinac MENU klikam
    QMouseEvent *clickEvent=new QMouseEvent(QEvent::MouseButtonPress,QPoint(24,12),Qt::LeftButton,Qt::LeftButton,Qt::NoModifier); 
    QApplication::sendEvent(windowWithMenu->menuBar(),clickEvent);
    delete clickEvent;
    // [2] naciskam strzalke do dolu
    QKeyEvent *keyEvent=new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier );  
    QApplication::sendEvent(windowWithMenu->menuBar() ,keyEvent);
    delete keyEvent;

    menu.exec(p);
}

Chyba zapomniałem wspomnieć o drobnym aczkolwiek istotnym ograniczeniu , ** nie ma myszki tylko sama klawiatura !**
Tak utworzone menu jako popup nie ma ustawionego fokus-a wiec nie mogę klawiaturą wybrać żadnej opcji a setfocus nie działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1