2017-02-17 47 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

谢谢了。为什么我无法获得高度和宽度,我真的很挣扎。 –