如何使QWidget(或QDialog)保持在其父窗口部件的中心位置?

3

我希望将一个QWidget(或QDialog)保持在其父窗口小部件的中心。是否真的需要连接到父窗口小部件的信号,或者有更简单的方法(例如设置某些内容)?


你尝试过什么?信号与保持小部件居中有什么关系? - pippin1289
尝试重写QWidget::moveEvent,但这会强制我更改父窗口小部件。 - Beachwalker
2个回答

5
我解决了这个问题并想回答自己的问题,如果有人会发现它有用的话。
保持在中心:
void MyMainWindow::moveEvent(QMoveEvent* event)
{
    const QPoint global = this->mapToGlobal(rect().center());
    waitDialog->move(global.x() - waitDialog->width() / 2, global.y() - waitDialog->height() / 2);
}

...其中waitDialog是我“等待…”指示器的实例。这需要覆盖父类(这里是MyMainWindow)的moveEvent方法。


0
如果您的QWidget是其父级窗口中的子项,则可以使用适当的设置将其添加到父级的QLayout(例如QBoxLayout或QGridLayout)中,以使布局居中。
如果它是QDialog(或某些其他QWidget,被设置为自己独立可移动的顶级窗口),则QLayout方法将无法工作。相反,您可以覆盖父窗口小部件的resizeEvent()方法,在子对话框上调用setGeometry(),以便在父窗口调整大小时更新子对话框的位置和/或大小。您还可能需要覆盖父级顶级窗口的moveEvent()方法,以检测用户何时移动了父窗口,以便您可以将对话框的位置移动以匹配该移动。不过,我不确定这是否是您真正想要的行为,因为通常用户希望能够独立地将对话框移动到屏幕上。

父窗口是主窗口或选项卡窗口,要保持居中的小部件是一个QDialog/QWidget,不能添加到父窗口的布局中(调整大小无法解决使用标题栏移动窗口的问题,对吧?) - Beachwalker
1
“使用标题栏移动窗口的问题”是指用户是否在父窗口的标题栏上拖动,还是在子对话框的标题栏上拖动不清楚。如果是前者,则覆盖父窗口的moveEvent()应该可以解决问题。如果是后者,您可能只想在显示对话框之前完全删除对话框的标题栏,例如通过调用setWindowFlags(Qt::Popup)或setWindowFlags(Qt::FramelessWindowHint)。 - Jeremy Friesner
它是父窗口的标题栏。 - Beachwalker

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