【问题标题】:QDialog not centered on parentQDialog 不以父级为中心
【发布时间】:2014-04-24 14:10:43
【问题描述】:

我知道 QDialog 应该默认定位在父窗口的中心,但我显然错过了一些微妙之处。我有一个从 QWidget 派生的对象,并且正在尝试使用以下测试代码创建一个以该对象为中心的子对话框

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

当我这样做时,对话框会出现在我窗口的左上角。 dialogPos 是 (0,0),thisPos 是 (808, 371)。

我错过了什么?为什么对话框没有像我预期的那样居中显示?

【问题讨论】:

标签: c++ qt qt5 qdialog


【解决方案1】:

如何将 QDialog 置于其父 QWidget 的中心

void Dialog::showEvent( QShowEvent* )
{
    QRect parentRect( parentWidget()->mapToGlobal( QPoint( 0, 0 ) ), 
parentWidget()->size() );
    move( QStyle::alignedRect( Qt::LeftToRight, Qt::AlignCenter, size(), 
parentRect ).topLeft() );
}

【讨论】:

  • @ChandaKorat,这段代码很简单,Qt 库的用户可以理解。实际上,首先使用高级语言是有好处的——如果编写得当,代码应该是不言自明的。此外,这个工作完美,值得被接受为解决方案,而不是被否决。
【解决方案2】:

我继承了一个 QDialog 并将以下代码放入构造函数中。

QPoint dialogCenter = mapToGlobal(rect().center());
QPoint parentWindowCenter = parent->window()->mapToGlobal(
    parent->window()->rect().center());
move(parentWindowCenter - dialogCenter);

之后对话框以父窗口为中心。我的系统运行的是 Qt5.3.1 和 Ubuntu 14.04。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多