使QDialog出现在不同的屏幕中

时间:2015-03-19 18:20:44

标签: c++ qt qdialog

标题几乎全是:

我有两个屏幕,每次创建QDialog时,它都显示在与其父屏幕相同的屏幕上。 如何让它出现在不同的屏幕上?或者我应该使用不同类型的顶级窗口小部件吗?

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

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

...

修改 我也尝试使用QDesktopWidget,它为我提供了一个引用第二个屏幕的QScreen对象。但后来我找不到如何指示QDialog使用QScreen(将其设置为父母没有工作)。

2 个答案:

答案 0 :(得分:3)

在不阅读评论的情况下编辑问题是不好的:(

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

就是这样。

<强>更新

你应该明白,只有一个屏幕区域有COMMON坐标系,它包含所有屏幕。

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

您应该阅读Qt documentation

答案 1 :(得分:1)

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

您可以获取主窗口的屏幕位置,并使用它来设置QDialog位置。只知道你不能保证最终用户机器上有2个屏幕。

有关move的详情,请参阅:http://doc.qt.io/qt-5/application-windows.html#window-geometry