首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSplashScreen不使用与QMainWindow相同的默认监视器

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

Stack Overflow用户
提问于 2016-10-11 08:20:34
回答 1查看 570关注 0票数 2

我有一个运行在Windows上的基于Qt的应用程序,它在一些初始化发生时显示一个QSplashScreen,然后我启动一个QMainWindow。无论QMainWindow使用哪种显示器,闪屏始终显示在显示器0上。例如,如果我从监视器0上的命令提示符启动应用程序,则闪屏和主窗口都会出现在监视器0上。如果我从监视器1上的命令提示符启动应用程序,则闪屏出现在监视器0上,主窗口出现在监视器1上。

需要明确的是:我并不想控制主窗口使用哪个监视器;我唯一的愿望是检测它将使用哪个监视器,然后让闪屏出现在同一个监视器上。我知道还有其他关于如何控制窗口使用哪个监视器的问题,而这不是我想要理解的。从我下面的调试代码中很明显,Windows正在以某种方式决定使用哪个监视器,我正在试图弄清楚如何在不显示任何内容的情况下知道这一点。这显然与主监视器无关。否则,我的主窗口将总是出现在主监视器上,但它不会。而且,我没有任何保存/恢复窗口位置的代码。Windows和/或Qt使用它们的默认值定位主窗口和闪屏。

我放入一些调试代码,如下所示:

代码语言:javascript
复制
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上显示命令提示符时的输出:

代码语言:javascript
复制
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上显示命令提示符时的输出:

代码语言:javascript
复制
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为我的应用程序分配了什么默认监视器?

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 19:54:37

由于windows将在包含光标的屏幕上显示您的应用程序,因此您可以使用

代码语言:javascript
复制
QApplication::desktop()->screenNumber(QCursor::pos())

要将闪屏移到此屏幕,请使用:

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39968667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档