如何在 QT 中将 QDialog 居中?

新手上路,请多包涵

我有这个示例代码:

 QDialog *dialog = new QDialog(this);
QPoint dialogPos = dialog->mapToGlobal(dialog->pos());
QPoint thisPos = mapToGlobal(this->pos());
dialog->exec();

但对话并不以他的父母为中心。提前致谢。

更新:

我从 MainWindow 的构造函数中调用 Dialog:

 MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    this->panelInferior = new WidgetTabsInferior;
    this->acciones = new Acciones(this);

    crearAcciones();
    crearBarraMenu();
    crearToolbar();
    crearTabsEditor();
    crearArbolDir();
    crearDockWindows();
    crearStatusBar();

    setWindowIcon(QIcon(":imgs/logo.png"));

    connect(this->pestanasEditor , SIGNAL(currentChanged(int)),this,SLOT(cambioTab(int)));

    this->dialogo = new AcercaDe(this);
    this->dialogo->move(x() + (width() - dialogo->width()) / 2,
                 y() + (height() - dialogo->height()) / 2);
    this->dialogo->show();
    this->dialogo->raise();
    this->dialogo->activateWindow();

}

但我得到的是:

在此处输入图像描述

原文由 Omar Murcia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

我在 github 上 有这段代码

inline void CenterWidgets(QWidget *widget, QWidget *host = 0) {
    if (!host)
        host = widget->parentWidget();

    if (host) {
        auto hostRect = host->geometry();
        widget->move(hostRect.center() - widget->rect().center());
    }
    else {
        QRect screenGeometry = QApplication::desktop()->screenGeometry();
        int x = (screenGeometry.width() - widget->width()) / 2;
        int y = (screenGeometry.height() - widget->height()) / 2;
        widget->move(x, y);
    }
}

希望能帮助到你

编辑

修复最近 Qt 版本发出的弃用警告:

 #include <QScreen>
#include <QWidget>
#include <QGuiApplication>

inline void CenterWidgets(QWidget *widget, QWidget *host = Q_NULLPTR) {
    if (!host)
        host = widget->parentWidget();

    if (host) {
        auto hostRect = host->geometry();
        widget->move(hostRect.center() - widget->rect().center());
    }
    else {
        QRect screenGeometry = QGuiApplication::screens()[0]->geometry();
        int x = (screenGeometry.width() - widget->width()) / 2;
        int y = (screenGeometry.height() - widget->height()) / 2;
        widget->move(x, y);
    }
}

原文由 CapelliC 发布,翻译遵循 CC BY-SA 4.0 许可协议

您必须更改 QDialog 的几何形状:

 dialog->move(x() + (width() - dialog->width()) / 2,
             y() + (height() - dialog->height()) / 2);

move() 函数移动尊重父级,因此不需要映射到全局。

在构造函数上,父级的位置和大小尚未设置。您可以尝试在单独的方法中执行对话框,或者,如果需要在构造函数中,尝试使用类似的方法

QTimer::singleShot(0, [=]() {
  // ... your dialog code
});

它将在事件循环的下一次迭代中显示。

原文由 cbuchart 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏