使 QDialog 出现在不同的屏幕中

Make a QDialog appear in a different screen

标题几乎说明了一切:

我有两个屏幕,每次我创建一个 QDialog 时,它都会出现在与其 parent 相同的屏幕中。 我怎样才能让它出现在不同的屏幕上?或者我应该使用不同类型的 top-level 小部件?

我用来创建对话框的代码是:

QDialog my_dialog = new QDialog(this,
                                Qt::WindowMaximizeButtonHint |
                                Qt::WindowCloseButtonHint);

...

编辑: 我也尝试过使用 QDesktopWidget ,它给了我一个 QScreen object 指的是第二个屏幕。但是后来我找不到如何指示 QDialog 使用 QScreen(将其设置为 parent 不起作用)。

您可以在 QDialog 上使用 move,但请注意 move 将设置相对于其父级的 QDialog 位置。

您可以获得主要 Window 的屏幕位置并使用它来设置 QDialog 的位置。只知道您不能保证在最终用户机器上有 2 个屏幕。

有关 move 的更多信息,请参阅:http://doc.qt.io/qt-5/application-windows.html#window-geometry

很糟糕,你在不阅读评论的情况下编辑你的问题:(

// Your screen geometry:
QRect buildScreenGeometry()
{
  auto desktop = QApplication::desktop();
  QRect virtualRect;

  const auto n = desktop->screenCount();
  for ( auto i = 0; i < n; i++ )
    virtualRect |= desktop->screenGeometry(i);

  return virtualRect;
}

// Moving
auto dlg = new QDialog( someParent );
auto newPoint = QPoint( 2000, 0 ); // point on another screen
auto realPos = someParent->mapFromGlobal( newPoint );
dlg->move( realPos );

就这些了。

更新:

您应该明白,只有一个具有通用坐标系的屏幕区域,它包含所有屏幕。

例如,您有 2 台分辨率为 800x600 的显示器。第一个(主要)显示器站在左边,第二个站在右边。在这种情况下,可用于您的应用程序的坐标系是 1600x600。因此,如果您的小部件在第一台显示器上的左上角位置为 100x100,并且您想将其移动到另一台显示器上,则应调用 move(900x100); // 900 == screen1.width() + dialog.pos().x()。然后您的小部件将在第二台显示器上有 100x100 的位置。

你应该阅读 Qt documentation