Qt:如何使主窗口在中心窗口大小调整时自动调整大小?

8
我想让我的CentralWidget具有特定的大小。我需要做什么才能使我的mainWindow随着其中心部件的调整而调整大小?以下是无法正常工作的代码:
int main (int argc, char **argv) {
    QApplication app(argc, argv);

    QGLFormat glFormat;
    glFormat.setVersion(4,2);
    glFormat.setProfile( QGLFormat::CompatibilityProfile);

    QGLWidget* render_qglwidget = new MyWidget(glFormat);

    QGLContext* glContext = (QGLContext *) render_qglwidget->context();
    glContext->makeCurrent();


    QMainWindow* mainWindow = new MyMainWindow();
    render_qglwidget->resize(720, 486);
    mainWindow->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
    mainWindow->setCentralWidget(render_qglwidget);

    render_qglwidget->resize(720, 486);

    mainWindow->show();

    return app.exec();
}

打开的窗口会非常小。可以使用以下代码设置主窗口的大小:
 mainWindow->resize(720, 486);

当窗口大小改变时,中心窗口也会改变其大小。但是中心窗口会稍微被挤压,因为主窗口的工具栏也位于那些486像素内。

如何让主窗口自动调整大小?

4个回答

3
您可以重新实现QMainWindow::event(),以便在中央窗口小部件的大小更改时自动调整窗口大小。
bool MyMainWindow::event(QEvent *ev) {
    if(ev->type() == QEvent::LayoutRequest) {
        setFixedSize(sizeHint());
    }
    return result = QMainWindow::event(ev);
}

在这里,您还需要使用 setFixedSize() 来设置中央部件的大小,而不是仅仅使用 resize()。当小部件被放置在布局内(这里是一个 QMainWindowLayout)时,后者几乎没有用处。


这会使主窗口短暂地弹出(小)并立即关闭。 - Mat
@Mat 我编辑了我的答案,使用setFixedSize也应该可以与NFRCR解决方案一起使用。 - alexisdm

0

设置中央窗口小部件的大小。然后获取主窗口的大小提示并将其设置为其大小。

(sizeHint(), setFixedSize())。


谢谢。如果我添加mainWindow->setFixedSize(hint.width(), hint.height());,由于某些原因窗口从未打开。 - Mat
@Mat 你在调用 setCentralWidget 后是否调用了 mainWindow->setFixedSize(hint) ? - alexisdm
是的 - 1. mainWindow->setCentralWidget,2. centralWidget->resize(),3. mainwindow->setFixedSize(hint),4. mainWindow->show()。第三步会使窗口不可见(如果我将第三步注释掉,则窗口会出现)。 - Mat

0

无法根据中心小部件设置QMainWindow的大小。 它总是相反的。

正如您所说,使用QMainWindow :: resize(),将工具栏和状态栏高度添加到您的中心小部件中以获得最终结果。

还要确保在“延迟初始化”中调整大小(即使用超时为0的QTimer),以便工具栏和状态栏的高度准确。

如果您希望用户无法调整主窗口的大小,请使用QMainWindow :: setWindowFlags(Qt :: FramelessWindowHint)禁用鼠标拖动调整大小。


谢谢。如果我使用setWindowFlags(Qt::FramelessWindowHint),那么我就无法通过鼠标调整窗口大小,但我也无法移动窗口。我想禁止使用鼠标调整窗口大小,但允许移动窗口。如何实现? - Mat

0
我使用了以下代码来解决类似的问题。我想显式地调整我的主窗口大小,以便中央小部件具有给定的大小。
def centralWidgetResize(self, x, y):
    # If the window is not visible, it doesn't keep its layout up to date, so force it.
    if not self.isVisible():
      self.layout().update()
    # Does nothing if the layout is already up to date (and the window is visible).
    self.layout().activate()
    size = self.size()
    childsize = self.centralWidget().size()
    dx = size.width() - childsize.width()
    dy = size.height() - childsize.height()
    self.resize(x + dx, y + dy)

这是Python代码,但C++代码应该很容易翻译。它还可以处理奇怪的工具栏位置或多个工具栏。请注意,实际大小的更新仅在窗口显示时发生,如果需要立即更新且窗口已隐藏,请执行另一个layout().update(); layout().activate()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接