QMdiArea返回错误的高度和宽度

时间:2017-02-17 04:32:43

标签: c++ qt user-interface

我正在尝试垂直安排QMdiArea中的子窗口。我在网上看到很多例子,他们都在做我在这里做的事情。

我有两个textEdits,需要垂直平铺,覆盖屏幕的一半。因此,在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

1 个答案:

答案 0 :(得分:2)

height()的{​​{1}}和width()在该阶段无效,因为小部件尚未曝光/显示。调用mdiArea仅调度一个小部件进行显示,调整大小并在屏幕上显示它的行为将在控件返回事件循环后发生。

作为解决方案,您可以覆盖show()处理程序。完成后,您的项目将再次运行:

在mainwindow.h中定义:

resizeEvent

在mainwindow.cpp中实现:

virtual void resizeEvent(QResizeEvent *ev) override;

您似乎并不需要在MainWindow的构造函数中调用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()); } } 。例如,您可以从main.cpp中调用它。