【问题标题】:How to keep a QWidget (or QDialog) centered to its parent widget?如何保持 QWidget(或 QDialog)以其父小部件为中心?
【发布时间】:2013-08-22 16:19:33
【问题描述】:

我想保持一个 QWidget(或 QDialog)以它的父小部件为中心。真的需要连接到父小部件的信号还是有更简单的方法(设置的东西)?

【问题讨论】:

  • 你试过什么?信号与保持小部件居中有什么关系?
  • 尝试覆盖 QWidget::moveEvent 但这迫使我更改父小部件

标签: c++ qt


【解决方案1】:

我自己解决了它,如果有人觉得它有帮助,我只是回答我自己的问题。

把它放在中间:

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)。

【讨论】:

    【解决方案2】:

    如果您的 QWidget 是其父级的在同一窗口中的子级,那么您可以使用适当的设置将其添加到父级的 QLayout(例如 QBoxLayout 或 QGridLayout)以使其布局居中。

    如果它是一个 QDialog(或其他一些设置为自己的可单独移动的顶级窗口的 QWidget),那么 QLayout 方法将不起作用;您可以做的是覆盖父窗口小部件的 resizeEvent() 方法以在子对话框上调用 setGeometry() ,以便子对话框在父窗口调整大小时更新其位置和/或大小。您可能还需要覆盖父级顶级窗口的 moveEvent() 方法来检测用户何时移动了父级窗口,以便您可以移动对话框的位置以匹配该移动。不过,我不能 100% 确定这是您真正想要的行为,因为通常用户希望能够独立于其父窗口移动有关屏幕的对话框。

    【讨论】:

    • parent 是主窗口或 tabwidget,保持居中的小部件是 qdialog/qwidget,不能添加到父级的布局中(调整大小不能解决移动窗口的问题是否使用标题栏?)
    • 不清楚“使用标题栏移动窗口的问题”是指用户在父窗口的标题栏上拖动,还是子对话框的标题栏。如果是前者,覆盖父窗口的 moveEvent() 应该可以工作。如果是后者,您可能只想完全摆脱对话框的标题栏,例如在显示之前调用 setWindowFlags(Qt::Popup) 或 setWindowFlags(Qt::FramelessWindowHint)。
    • 它是父窗口的标题栏
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2011-06-24
    • 2018-11-26
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多