我有一个运行在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为我的应用程序分配了什么默认监视器?
发布于 2018-06-04 19:54:37
由于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();https://stackoverflow.com/questions/39968667
复制相似问题