【发布时间】:2013-08-22 16:19:33
【问题描述】:
我想保持一个 QWidget(或 QDialog)以它的父小部件为中心。真的需要连接到父小部件的信号还是有更简单的方法(设置的东西)?
【问题讨论】:
-
你试过什么?信号与保持小部件居中有什么关系?
-
尝试覆盖 QWidget::moveEvent 但这迫使我更改父小部件
我想保持一个 QWidget(或 QDialog)以它的父小部件为中心。真的需要连接到父小部件的信号还是有更简单的方法(设置的东西)?
【问题讨论】:
我自己解决了它,如果有人觉得它有帮助,我只是回答我自己的问题。
把它放在中间:
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 是我的“等待...”指示器的一个实例。这需要重写父级的moveEvent 方法(这里是MyMainWindow)。
【讨论】:
如果您的 QWidget 是其父级的在同一窗口中的子级,那么您可以使用适当的设置将其添加到父级的 QLayout(例如 QBoxLayout 或 QGridLayout)以使其布局居中。
如果它是一个 QDialog(或其他一些设置为自己的可单独移动的顶级窗口的 QWidget),那么 QLayout 方法将不起作用;您可以做的是覆盖父窗口小部件的 resizeEvent() 方法以在子对话框上调用 setGeometry() ,以便子对话框在父窗口调整大小时更新其位置和/或大小。您可能还需要覆盖父级顶级窗口的 moveEvent() 方法来检测用户何时移动了父级窗口,以便您可以移动对话框的位置以匹配该移动。不过,我不能 100% 确定这是您真正想要的行为,因为通常用户希望能够独立于其父窗口移动有关屏幕的对话框。
【讨论】: