如何在 QT 中将 QDialog 居中?
How to center a QDialog in QT?
我有这个示例代码:
QDialog *dialog = new QDialog(this);
QPoint dialogPos = dialog->mapToGlobal(dialog->pos());
QPoint thisPos = mapToGlobal(this->pos());
dialog->exec();
但是Dialog没有以他的parent为中心。提前致谢。
更新:
我在 MainWindow 的构造函数中调用对话框:
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();
}
但我得到的是:
您必须更改 QDialog 的几何形状:
dialog->move(x() + (width() - dialog->width()) / 2,
y() + (height() - dialog->height()) / 2);
move()
函数移动尊重父级,因此没有必要映射到全局。
在构造函数中,父对象的位置和大小尚未设置。您可以尝试在单独的方法中执行对话框,或者如果在构造函数中需要,请尝试使用
QTimer::singleShot(0, [=]() {
// ... your dialog code
});
它将在事件循环的下一次迭代中显示。
我在 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);
}
}
我认为这是一个 Qt4 错误。我在 Ubuntu 上使用 Qt4,它不尊重父窗口小部件中心。
但是,当我使用 Qt5 时,它似乎工作正常。
您也可以使用move()
到达您的位置。
我想我会 post 我自己的解决方案。 @CapelliC 的 works, but is deprecated since Qt5.11. Infact, the documentation says the QDesktopWidget class 已过时。
解决方法(略粗)就是使用QGuiApplication::screenAt()
上下文: class继承QMainWindow, but can can extend for any 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));
希望对您有所帮助。
我有这个示例代码:
QDialog *dialog = new QDialog(this);
QPoint dialogPos = dialog->mapToGlobal(dialog->pos());
QPoint thisPos = mapToGlobal(this->pos());
dialog->exec();
但是Dialog没有以他的parent为中心。提前致谢。
更新:
我在 MainWindow 的构造函数中调用对话框:
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();
}
但我得到的是:
您必须更改 QDialog 的几何形状:
dialog->move(x() + (width() - dialog->width()) / 2,
y() + (height() - dialog->height()) / 2);
move()
函数移动尊重父级,因此没有必要映射到全局。
在构造函数中,父对象的位置和大小尚未设置。您可以尝试在单独的方法中执行对话框,或者如果在构造函数中需要,请尝试使用
QTimer::singleShot(0, [=]() {
// ... your dialog code
});
它将在事件循环的下一次迭代中显示。
我在 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);
}
}
我认为这是一个 Qt4 错误。我在 Ubuntu 上使用 Qt4,它不尊重父窗口小部件中心。
但是,当我使用 Qt5 时,它似乎工作正常。
您也可以使用move()
到达您的位置。
我想我会 post 我自己的解决方案。 @CapelliC 的
解决方法(略粗)就是使用QGuiApplication::screenAt()
上下文: class继承QMainWindow, but can can extend for any 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));
希望对您有所帮助。