(Тестирование с C ++ на Qt 4.8 и Ubuntu 12.10 unity)
У меня есть главное окно, которое отображает QDialog. Когда я открываю диалоговое окно в полноэкранном режиме, оно, кажется, не всегда работает, хотя кажется, что это правильное окно.
То есть окно может появиться в полноэкранном режиме, но только иногда.
У кого-нибудь есть идея? Я знаю, что Qt утверждает, что это может не работать для всех сред X, но это не так уж плохо, не так ли?
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDialog* d = new QDialog();
d->setModal(false);
d->show();
qDebug() << d->isWindow();
// works most of the times, though not always:
// d->showFullScreen();
// sometimes works, sometimes it doesn't:
QTimer::singleShot(2000, d, SLOT(showFullScreen()));
}
DomTomCat здесь в stackoverflow показал способ обнаружения Ubuntu, и проблема QDialog связана с ошибкой в Metacity (оконный менеджер по умолчанию в Ubuntu).
Metacity не управляет диалоговыми окнами и главными окнами одинаково, и его нужно обмануть, заставляя думать, что QDialog — это обычное окно. Чтобы сделать это с помощью класса QDialog, необходимо изменить флаги окна.
Вместо того, чтобы делать все шаги, которые говорит DomTomCat, вы можете обнаружить сеанс, а затем просто
//example inside the QDialog
this->setWindowFlags(Qt::Window);
this->showFullScreen();
Об ошибке сообщалось (и игнорировалось) раньше, но, насколько я знаю, это первый простой обходной путь.
https://bugreports.qt.io/browse/QTBUG-16034
https://git.gnome.org/browse/metacity/tree/src/core/window.c#n6326
Ubuntu также может использовать compiz. Это можно увидеть по адресу:
grep DefaultProvider-windowmanager /usr/share/gnome-session/sessions/*
С наилучшими пожеланиями,
Икер Де Эчаниз.
Я пришел к методу, который работает. Я не знаю, почему это работает по сравнению с просто звонком showFullScreen()
, Я думаю, что это не идеальное и чистое решение. Это, безусловно, может быть адаптировано к другим переменным среды и X сеансам.
QDialog* d = new QDialog();
d->setModal(false);
d->show();
const QString session = QString(getenv("DESKTOP_SESSION")).toLower();
QByteArray geometry;
if (session == "ubuntu") {
geometry = _d->saveGeometry();
d->setFixedSize(qApp->desktop()->size());
d->setWindowFlags(Qt::FramelessWindowHint);
d->setWindowState( d->windowState() | Qt::WindowFullScreen);
d->show();
d->activateWindow();
} else {
d->showFullScreen();
}
Для восстановления из полноэкранного состояния это сработало
if (session == "ubuntu") {
d->setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
d->setMinimumSize(0,0);
d->restoreGeometry(geometry);
d->setWindowFlags(Qt::Dialog);
d->show();
d->activateWindow();
} else {
d->showNormal();
}