Qt - QMainWindow - jak pobrać aktualny rozmiar okna ?

0

Jak w temacie.

Potrzebuję pobrać aktualny rozmiar okna podczas rozciągania i zmniejszania okna.

Czy ktoś powie jak to zrobić w klasie MainWindow ?

wiem, że jest taka funkcja wirtualna

void QWidget::resizeEvent(QResizeEvent *event)

ale tutaj już moje umiejętności się kończą - gdyby ktoś podał gotowca...

4

Pachnie mi to problemem XY.

0

@MarekR22:
Możliwe ale skąd wziął się ten problem ? Bo zacząłem się bawić klasami QMenu i QMenuBar ale zanim mnie zajedziecie, to mam pewien nieestetyczny problem w którym próbuję dociec "dlaczego jest tak, a nie inaczej" - o co konkretnie chodzi ?

  1. zrobiłem sobie banalnie proste menu za pomocą takiego kawałka kodu (jakby nie było umiem tworzyć menu ale mam pewną dygresję którą chcę po prostu rozwiązać)
menuBar()->addMenu("test"); //i już mam menu - tadaaa

screenshot-20210708225830.png

  1. zrobiłem sobie to samo ale w zupełnie inny sposób
menu = new QMenu(this);
menu->setTitle("test");

menuBarr = new QMenuBar(this);
menuBarr->addMenu(menu); //i też się pojawia menu tadaaa

screenshot-20210708230031.png

ale co psuje mi zabawę ? Konkretnie chodzi o ten biały pasek menu z pierwszego zrzutu który ładnie dopasowuje się do rozmiaru okna i zmienia swój rozmiar podczas zmiany rozmiaru okna. W pierwszym zrzucie menu jest ładne i proporcjonalne do wysokości czcionki i szerokości okna - nawet jak okno rozciągnę to menu zawsze jest wypełnione białym tłem

ale w drugim przypadku tego efektu nie ma - kwadrat na czerwono

screenshot-20210708230342.png

no i zadaję sobie pytanie co to trzeba zrobić aby osiągnąć taki sam efekt rozciągnięcia menu jak na pierwszym zrzucie ?

Czy ktoś miły powie ?

4

No i faktycznie jest to problem XY. Tutaj chcesz użyć layoutów i ustawić odpowiednie opcje rozciągania widgetu.

https://doc.qt.io/qt-5/layout.html

3

po pierwsze QMainWindow domyślnie ma mechanizmy rozmieszczające automatycznie w layout standardowe elementy UI.
W dokumentacji jest rysunek:
schema layout QMainWindow.

Używając QMainWindow::menuBar() aktywowałeś jeden z tych mechanizmów, dlatego menu się rozciągnęło domyślnie.

Albo dostosuj się do funkcjonalności QMainWidow, albo zredukuj swoją klasę do QWidget.
Z doświadczenia powiem, że lepiej współpracować z biblioteką a nie walczyć z nią (dotyczy nie tylko Qt).

0

@MarekR22:

Z doświadczenia powiem, że lepiej współpracować z biblioteką

a gdzie ja nie współpracuję ? Bo nie wiem co robię źle...

0

Może najpierw sprawdź która zmiana to powoduje, czyi spróbuj:

menu = new QMenu(this);
menuBar()->addMenu(menu);
menu->setTitle("test");

Poza tym ja bym się nie bawił w dochodzenie, zwyczajnie:

QMenu *menu=menuBar()->addMenu("test");
QMenu *sub=menu->addMenu("A");
2

O menuBar():

https://doc.qt.io/qt-5/qmainwindow.html#menuBar

Returns the menu bar for the main window. This function creates and returns an empty menu bar if the menu bar does not exist.

Ładne osadzenie w oknie jest implikowane przez „creates”.

EDIT: uzupełenienie:
Podejrzewam (ale nie sprawdzałem), że

menu = new QMenu(this);
menu->setTitle("test");

menuBarr = new QMenuBar(this);
menuBarr->addMenu(menu); 
setMenuBar(menuBarr);

da podobny efekt

0

@alagner:
twój sposób działa:

w sumie są 4 rodzaje wyjścia z sytuacji

  1. rozwiązanie to oczywiście twoje
menuFile = new QMenu(this);
menuFile->setTitle("Plik");

menuBarr = new QMenuBar(this);
menuBarr->addMenu(menuFile);

setMenuBar(menuBarr);
  1. drugie rozwiązanie
menuFile = new QMenu(this);
menuFile->setTitle("Plik");

menuBarr = menuBar(); //działa ale nie wiem czy prawidłowo zrobione
menuBarr->addMenu(menuFile);
  1. rozwiązanie - ale to chociaż dopasuje rozmiar do zawartości w menu - a nie do okna
menuFile = new QMenu(this);
menuFile->setTitle("Plik");

menuBarr = new QMenuBar(this);
menuBarr->addMenu(menuFile);
menuBarr->adjustSize(); //dopasowanie rozmiaru
  1. rozwiązanie
menuFile = new QMenu(this);
menuFile->setTitle("Plik");

menuBarr = new QMenuBar(this);
menuBarr->addMenu(menuFile);
setMenuWidget(menuBarr); //też działa

żaden Layout nie działa - nie wiem czemu...

w dokumentacji znalazłem coś takiego - nie jest powiedziane wprost, ale rozumiem to tak, że jak to zrobię to powinno działać

setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setHidden(false);
updateGeometry(); //o tym była mowa... że to powinno sprawić, że zadziała
show();

dlatego 5 rozwiązaniem, uważam, że gdybym umiał w sposób dynamiczny pobrać rozmiar okna, to ten rozmiar przekazałbym do slota w którym byłaby funkcja setFixedWidth() i też miałbym to co chcę

2

dlatego 5 rozwiązaniem, uważam, że gdybym umiał w sposób dynamiczny pobrać rozmiar okna, to ten rozmiar przekazałbym do slota w którym byłaby funkcja setFixedWidth() i też miałbym to co chcę

Pewnie tak, tylko dookoła. To byłaby właśnie ta "walka z frameworkiem" o której pisał Marek wcześniej. BTW: otwórz źródła QT, zobacz co robi ta metoda menuBar() i co dla tego paska ustawia jak chcesz wiedzieć co tam jest pod spodem.

EDIT 1 i 2 to w zasadzie to samo o ile tego paska menu jeszcze nie ma.

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