gpt4 book ai didi

c++ - QMdiArea 返回错误的高度和宽度

转载 作者:搜寻专家 更新时间:2023-10-31 02:12:48 25 4
gpt4 key购买 nike

我试图在 QMdiArea 中垂直排列我的子窗口。我在网上看到了很多例子,他们都在做和我在这里做的一样的事情。

我有两个 textEdits 需要垂直平铺,它们都覆盖了一半的屏幕。因此,在 MainWindow 的构造函数中,我将两个文本编辑作为子窗口添加到 qMdiArea,然后找到 qMdiArea 的高度和宽度,将高度除以 2 并调整子窗口的大小。请看下面的代码。

我的主窗口.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;
}

我的窗口.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

最佳答案

mdiAreaheight()width() 在那个阶段是无效的,因为widget 还没有暴露/显示然而。调用 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 调用它。

关于c++ - QMdiArea 返回错误的高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42289447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com