2017-02-17 22 views
2

Я пытаюсь упорядочить мои под-окна в QMdiArea вертикально. Я видел много примеров онлайн, и все они делали то же самое, что и я здесь.QMdiArea возвращает неправильную высоту и ширину

У меня есть два текстовых элемента, которые должны быть выложены плиткой по вертикали и покрывать половину экрана. Поэтому в конструкторе MainWindow я добавляю два элемента textEdits в качестве subWindow в qMdiArea, а затем найдите высоту и ширину qMdiArea, разделив высоту на 2 и изменив размер subWindow. См. Код ниже.

Мой 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; 
} 

Мой 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 

и мой основной файл:

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

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

    return a.exec(); 
} 

Но это не происходит так, как ожидалось. Окно просто занимает часть экрана, хотя они черепичные по вертикали. Мое разрешение экрана 1920x1200

enter image description here

ответ

2

height() и width() из mdiArea является недействительным на этом этапе, потому что виджет не подвергался/показано еще. Вызов show() определяет только виджет для отображения, действие его калибровки и отображение его на экране происходит позже, когда элемент управления возвращается в цикл событий.

В качестве решения вы можете переопределить обработчик resizeEvent. После того, как вы это сделаете, ваш проект будет работать снова:

Определение в mainwindow.h:

virtual void resizeEvent(QResizeEvent *ev) override; 

Реализация в 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()); 
    } 
} 

Кроме того, кажется, что вы на самом деле не нужно для вызова this->showMaximized(); в конструктор MainWindow. Вы можете вызвать его из main.cpp, например.

+0

Спасибо тонну. Я действительно борется за то, почему я не могу получить высоту и ширину. –