【问题标题】:How to center a QDialog in QT?如何在 QT 中将 QDialog 居中?
【发布时间】:2017-07-08 13:00:43
【问题描述】:

我有这个示例代码:

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();

}

但我得到的是:

【问题讨论】:

标签: c++ qt qmainwindow qdialog


【解决方案1】:

我在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);
    }
}

【讨论】:

  • 此代码仅适用于第一个屏幕。如果您想在不同的屏幕上居中,则必须将 screenGeometry.x() 和 screenGeometry.y() 添加到 x 和 y。
【解决方案2】:

我想我会在这里发布我自己的解决方案。 @CapelliC 的 solution 有效,但自 Qt5.11 起已弃用。事实上,文档说 QDesktopWidget 类已经过时了。

解决方案有点粗略)是使用QGuiApplication::screenAt()

上下文:类继承QMainWindow,但可以扩展为任何QWidget

// Get current screen size
QRect rec = QGuiApplication::screenAt(this->pos())->geometry();

// Using minimum size of window
QSize size = this->minimumSize();

// Set top left point
QPoint topLeft = QPoint((rec.width() / 2) - (size.width() / 2), (rec.height() / 2) - (size.height() / 2));

// set window position
setGeometry(QRect(topLeft, size));

希望对你有帮助。

【讨论】:

    【解决方案3】:

    我认为这是一个 Qt4 错误。我在 Ubuntu 上使用了 Qt4,它不尊重父小部件中心。

    但是,当我使用 Qt5 时,它似乎工作正常。

    您也可以使用move() 到达您的位置。

    【讨论】:

      【解决方案4】:

      你必须改变 QDialog 的几何形状:

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

      move() 函数相对于父函数移动,因此不需要映射到全局。

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

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

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

      【讨论】:

      • 谢谢,我更新了我的问题,对话框无法正常工作。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多