我在Windows上运行一个基于Qt的应用程序,在初始化时显示QSplashScreen,然后我调出一个QMainWindow。无论QMainWindow使用何种显示器,启动屏幕始终显示在监视器0上。例如,如果我从监视器0上的命令提示符启动应用程序,则启动屏幕和主窗口都会出现在监视器0上。如果我从监视器1上的命令提示符启动应用程序,则监视器0上会出现启动屏幕监视器1上的主窗口。
非常明确:我不是想控制主窗口使用哪个监视器;我唯一的愿望是检测它将使用哪一个,然后让闪屏出现在同一台显示器上。我知道还有其他问题关于如何控制窗口使用哪个监视器,而这不是我想要理解的。从我下面的调试代码中可以看出,Windows在某种程度上决定使用哪个监视器,而我正在试图弄清楚如何在不显示任何内容的情况下知道它。这也非常清楚,不是关于主监视器。否则,我的主窗口将始终显示在主监视器上,而不是。此外,我没有任何保存/恢复窗口位置的代码。 Windows和/或Qt使用默认设置定位主窗口和启动画面。
我输入了一些调试代码,如下所示:
QSplashScreen splash (QPixmap (":/splash.png"));
splash.show ();
qDebug () << __LINE__ << "Splash screen monitor: " << app->desktop ()->screenNumber (&splash); // Line 114 in output
app->processEvents ();
// Do a bunch of behind-the-scenes visualization.
aBunchOfStuff ();
// Create and activate main window.
QMainWindow *main_wnd = new QMainWindow ();
qDebug () << __LINE__ << "Main window monitor (created): " << app->desktop ()->screenNumber (main_wnd); // Line 139 in output
main_wnd->show ();
qDebug () << __LINE__ << "Main window monitor (shown): " << app->desktop ()->screenNumber (main_wnd); // Line 141 in output
命令提示符在监视器0上时输出:
10/10/16 16:06:53: Debug: 114 Splash screen monitor: 0
10/10/16 16:06:54: Debug: 139 Main window monitor (created): 0
10/10/16 16:06:54: Debug: 141 Main window monitor (shown): 0
命令提示符在监视器1上时的输出:
10/10/16 16:07:01: Debug: 114 Splash screen monitor: 0
10/10/16 16:07:03: Debug: 139 Main window monitor (created): 0
10/10/16 16:07:03: Debug: 141 Main window monitor (shown): 1
正如您所看到的,在创建和显示之间,当命令提示符在监视器1上时,主窗口的监视器编号从0变为1。
使用QDesktopWidget我知道的任何技术,看起来在我实际显示之前我无法知道主窗口将出现在哪个监视器上。我考虑在显示启动画面之前创建一个虚拟窗口,但我不想在屏幕上闪烁任何东西,并且第139和141行之间的输出显示窗口小部件在它可见之前不知道它的监视器。
是否有某种方法,无论是使用Qt代码还是Windows API,都知道Windows已为我的应用程序分配了什么默认监视器?
答案 0 :(得分:1)
由于Windows会在包含光标的屏幕上显示您的应用程序,您可以使用
获取当前的屏幕编号QApplication::desktop()->screenNumber(QCursor::pos())
要将启动画面移动到此屏幕,请使用:
QSplashScreen* splash = new QSplashScreen;
QDesktopWidget* desktop = QApplication::desktop();
const int scrn = desktop->screenNumber(QCursor::pos());
const QPoint currentDesktopsCenter = desktop->availableGeometry(scrn).center();
splash->move(currentDesktopsCenter - splash->rect().center());
splash->show();