(在Qt 4.8和Ubuntu 12.10统一上使用C ++进行测试)
我有一个显示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()));
}
答案 0 :(得分:4)
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/*
致以最诚挚的问候,
Iker De Echaniz。
答案 1 :(得分:1)
我来了一个有效的方法。与仅调用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();
}