QSplashScreen不使用与QMainWindow相同的默认监视器

时间:2016-10-11 00:20:34

标签: windows qt

我在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已为我的应用程序分配了什么默认监视器?

1 个答案:

答案 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();