2017-02-17 3 views
2

Ich versuche, meine Unterfenster vertikal in der QMdiArea anzuordnen. Ich habe viele Beispiele online gesehen und alle taten das gleiche wie ich hier.QMdiArea gibt die falsche Höhe und Breite zurück

Ich habe zwei TextEdits, die vertikal gekachelt werden müssen, beide die Hälfte des Bildschirms abdecken. Im Konstruktor des MainWindow füge ich also die zwei textEdits als Unterfenster zur qMdiArea hinzu und finde dann die Höhe und Breite der qMdiArea, teile die Höhe durch 2 und verändere die Größe des Unterfensters. Bitte beachten Sie den folgenden Code.

Mein mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    this->showMaximized(); 
    qMdiArea = new QMdiArea(); 
    qTextEdit1 = new QTextEdit(); 
    qTextEdit2 = new QTextEdit(); 
    setCentralWidget(qMdiArea); 

    qMdiArea->adjustSize(); 
    qMdiArea->addSubWindow(qTextEdit1); 
    qMdiArea->addSubWindow(qTextEdit2); 

    QPoint position(0, 0); 
    foreach (QMdiSubWindow *window, qMdiArea->subWindowList()) 
    { 
     QRect rect(0, 0, qMdiArea->width(), qMdiArea->height()/qMdiArea->subWindowList().count()); 
     window->setGeometry(rect); 
     window->move(position); 
     position.setY(position.y() + window->height()); 
    } 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

Mein window.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QMdiArea> 
#include <QTextEdit> 
#include <QPoint> 
#include <QMdiSubWindow> 
#include <QRect> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
    QMdiArea *qMdiArea; 
    QTextEdit *qTextEdit1; 
    QTextEdit *qTextEdit2; 
}; 

#endif // MAINWINDOW_H 

und mein Haupt File:

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

Aber es ist nicht wie erwartet geschieht. Das Fenster belegt nur einen Teil des Bildschirms, obwohl sie vertikal gekachelt sind. Meine Bildschirmauflösung 1920x1200

enter image description here

Antwort

2

Die height() und width() von mdiArea zu diesem Zeitpunkt ungültig sind, weil das Widget ausgesetzt wurde nicht/gezeigt noch. Wenn Sie show() aufrufen, wird nur ein Widget für die Anzeige geplant, die Größenänderung und Anzeige auf dem Bildschirm erfolgt später, wenn das Steuerelement in die Ereignisschleife zurückgekehrt ist.

Als Lösung können Sie den Handler resizeEvent überschreiben. Sobald Sie das tun, wird Ihr Projekt wieder arbeiten:

Definition in mainwindow.h:

virtual void resizeEvent(QResizeEvent *ev) override; 

Implementierung in mainwindow.cpp:

void MainWindow::resizeEvent(QResizeEvent *ev) 
{ 
    Q_UNUSED(ev) 

    QPoint position(0, 0); 
    foreach (QMdiSubWindow *window, qMdiArea->subWindowList()) 
    { 
     QRect rect(0, 0, qMdiArea->contentsRect().width(), qMdiArea->contentsRect().height()/qMdiArea->subWindowList().count()); 
     window->setGeometry(rect); 
     window->move(position); 
     position.setY(position.y() + window->height()); 
    } 
} 

Auch scheint es, dass Sie nicht wirklich brauchen this->showMaximized(); Aufruf in MainWindow-Konstruktor haben. Sie können es beispielsweise von main.cpp aus aufrufen.

+0

Vielen Dank. Ich habe wirklich gekämpft, weil ich nicht in der Lage bin, Höhe und Breite zu erreichen. –

Verwandte Themen