2017-02-17 42 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()mdiAreawidth()無效在這個階段,因爲小部件尚未暴露/尚所示。調用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()); 
    } 
} 

而且似乎你並不真的需要在MainWindow的構造函數中調用this->showMaximized();。例如,您可以從main.cpp中調用它。

+0

謝謝了。爲什麼我無法獲得高度和寬度,我真的很掙扎。 –