QT 5.3 Mac полноэкранный режим

#c #macos #qt #fullscreen

#c #macos #qt #полноэкранный режим

Вопрос:

Я пытаюсь настроить свое приложение на полноэкранный режим и обратно в Qt 5.3, но у меня возникли некоторые проблемы на Mac. Когда я использую showFullScreen() , он переходит в полноэкранный режим, как и ожидалось. Он использует стандартный полноэкранный режим Mac, в котором он открывается на отдельном рабочем столе / пространстве. Однако, когда я вызываю showNormal() возврат из полноэкранного режима, окно приложения просто исчезает, и я остаюсь с серым фоном. Мне нужно провести пальцем, чтобы вернуться на обычный рабочий стол, на котором находится приложение.

Это ошибка в Qt или я делаю что-то не так? Я на OS X 10.9.3.

Ответ №1:

У меня были похожие проблемы с Qt 5.2 на Mac OS X (но не Qt 4.8). Кажется, это исправляет:

 if ( showFullScreen )
{
    widget->setParent( NULL );
    widget->showFullScreen();
}
else
{
    // changing the order of the showNormal() and setParent() results in a grey screen in Qt 5 on Mac
    widget->showNormal();
    widget->setParent( widgetParent ); // reset the original parent
}
  

Ответ №2:

Я не уверен, связано ли это или это с вашей проблемой. Но кажется, что вызовы showFullScreen() и showNormal() ошибки на Mac.

Вы можете изменить вызовы на showFullScreen() и showNormal() с setWindowState() помощью .

showFullScreen(); может быть изменен на

 setWindowState(windowState() | Qt::WindowFullScreen);
  

И showNormal(); может быть изменен на

  setWindowState(windowState() amp; ~Qt::WindowFullScreen);
  

Комментарии:

1. Спасибо за ответ! Я попробовал, но, к сожалению, я вижу то же поведение.

Ответ №3:

Вот простой пример приложения, которое корректно работает в моей системе (Qt 5.3.1, macOS / X 10.9.5). Правильно ли это работает и для вас? Если это так, попробуйте выяснить, чем отличается эта программа от вашей программы.

Вы также можете попробовать вызвать show(), raise() и activateWindow() после вызова showNormal() и посмотреть, помогут ли эти вещи.

 // MyWindow.h
#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <QAction>
#include <QLabel>
#include <QTimer>
#include <QTime>
#include <QMainWindow>

class MyWindow : public QMainWindow
{
Q_OBJECT

public:
   MyWindow();

private slots:
   void goFS();
   void goNormal();

private:
   QAction * fsAct;
   QAction * normAct;
};

#endif // MYWINDOW_H
  

… и файл .cpp:

 // MyWindow.cpp
#include <QApplication>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include "MyWindow.h"

MyWindow :: MyWindow()
{
   fsAct = new QAction(tr("Full Screen Mode"), this);
   connect(fsAct, SIGNAL(triggered()), this, SLOT(goFS()));

   normAct = new QAction(tr("Normal Mode"), this);
   connect(normAct, SIGNAL(triggered()), this, SLOT(goNormal()));
   normAct->setEnabled(false);

   QMenuBar * mb = menuBar();
   QMenu * modeMenu = mb->addMenu(tr("ScreenMode"));
   modeMenu->addAction(fsAct);
   modeMenu->addAction(normAct);
}

void MyWindow :: goFS()
{
   normAct->setEnabled(true);
   fsAct->setEnabled(false);

   showFullScreen();
}

void MyWindow :: goNormal()
{
   normAct->setEnabled(false);
   fsAct->setEnabled(true);

   showNormal();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MyWindow scr;
    scr.show();

    return a.exec();
}