Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在qt5中,什么';显示多显示器全屏QWidget窗口的正确方式是什么?_C++_Qt_Qt5_Fullscreen - Fatal编程技术网

C++ 在qt5中,什么';显示多显示器全屏QWidget窗口的正确方式是什么?

C++ 在qt5中,什么';显示多显示器全屏QWidget窗口的正确方式是什么?,c++,qt,qt5,fullscreen,C++,Qt,Qt5,Fullscreen,我有一个Windows&Mac程序,可以在多个显示器上切换到全屏模式。在Qt4中,似乎(我找不到关于如何执行此操作的明确文档)“正确”的方法是为机器上的N个监视器创建NQMainWindow,对N个监视器的左上角x,y坐标调用QWidget::move(),然后调用QWidget::SetWindowsState(Qt::WindowFullScreen)。我不知道这样做是否正确——同样,我在Qt中找不到任何这样做的文档或示例 在Qt5.4.1中,尤其是在Windows7上,这似乎是“坏的”(如

我有一个Windows&Mac程序,可以在多个显示器上切换到全屏模式。在Qt4中,似乎(我找不到关于如何执行此操作的明确文档)“正确”的方法是为机器上的N个监视器创建N
QMainWindow
,对N个监视器的左上角x,y坐标调用
QWidget::move()
,然后调用
QWidget::SetWindowsState(Qt::WindowFullScreen)
。我不知道这样做是否正确——同样,我在Qt中找不到任何这样做的文档或示例

在Qt5.4.1中,尤其是在Windows7上,这似乎是“坏的”(如果一开始它是正确的话)。我仍在尝试隔离问题,但似乎
QMainWindow
s正在退出全屏模式

我很清楚,什么是正确的方法?我发现论坛帖子似乎建议我应该在
QMainWindow
s持有的底层
QWindow
对象上设置
QScreen
,但这在我的测试中似乎不起作用。下面是我编写的一个示例程序:

附录h:

#include <vector>
#include <QObject>

class QMainWindow;

class app : public QObject
{
    Q_OBJECT
public:
    int run(int argc, char** argv);

public slots:
    void add_window();
    void remove_window();
    void windows_go_to_screens();
    void windows_go_to_screens_old();
    void windows_go_to_primary_screen();
    void windows_fullscreen();
    void windows_nonfullscreen();

private:
    QMainWindow * create_window(const char * id);
    void init_menus( QMainWindow * w );

    std::vector<QMainWindow *> m_windows;
};
当我在OSX上运行这个程序时,“Windows转到屏幕”功能什么都不做——所有的窗口都不移动。“Windows转到主屏幕”(名称不正确-应该是0屏幕?)。在N窗口Mac上创建N个以上的窗口很有趣-在这种情况下,多次调用“windows全屏”实际上会将QMainWindows切换到全屏模式,一次一个

更有趣的是,当您执行此操作时,在多监视器OSX机器上会发生什么:“添加窗口”,直到您拥有与显示器一样多的窗口。“Windows转到屏幕(旧方法)”会将每个窗口发送到每个监视器的左上角。“Windows全屏”将使所有窗口在所有监视器上全屏显示。“移除窗口”直到只剩下一个窗口。然后是“Windows非全屏”,你会得到一个有趣的惊喜。进入任务控制中心看看发生了什么


谁能告诉我做这件事的正确方法是什么?我查看了Qt5示例-有一个播放器应用程序似乎彻底崩溃(它可以在全屏模式下播放一次视频,然后在单独的桌面窗口中播放后续视频),子游戏仅最大化为单个显示,其他示例似乎都没有使用全屏模式,当然不是在多个监视器上。

在Qt5中执行此操作的一种方法是使用
QWindow::setScreen
设置窗口应显示的屏幕
QWidget
有一个
windowHandle()
返回指向
QWindow
的指针。因此,您可以获取每个窗口的指针,并设置不同的屏幕

以下是如何以全屏模式在最后一屏显示小部件:

QWidget * widget = new QWidget();
widget->show();
widget->windowHandle()->setScreen(qApp->screens().last());
widget->showFullScreen();
或在第二个屏幕中:

QWidget * widget = new QWidget();
widget->show();
widget->windowHandle()->setScreen(qApp->screens()[1]);
widget->showFullScreen();
QWidget * widget = new QWidget();
widget->show();
widget->windowHandle()->setScreen(qApp->screens().last());
widget->showFullScreen();
QWidget * widget = new QWidget();
widget->show();
widget->windowHandle()->setScreen(qApp->screens()[1]);
widget->showFullScreen();