我正在尝试垂直安排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
答案 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中调用它。