使 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。
标题几乎说明了一切:
我有两个屏幕,每次我创建一个 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。