在主窗口内全屏显示QDialog,仅在某些情况下工作 (QC++ 4.8和Ubuntu 12.10统一的C++测试)< /P>

在主窗口内全屏显示QDialog,仅在某些情况下工作 (QC++ 4.8和Ubuntu 12.10统一的C++测试)< /P>,c++,qt,fullscreen,qdialog,C++,Qt,Fullscreen,Qdialog,我有一个显示QDialog的主窗口。当我将对话框窗口置于全屏时,它似乎并不总是工作,即使它似乎是一个合适的窗口。 这意味着,窗口可以全屏显示,尽管只是有时 有人有主意吗?我知道Qt声明它可能不适用于所有X环境,但它不会那么糟糕,不是吗 MainWindow::MainWindow(QWidget*父项): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); QDialog*d=新的QDialog(); d->setModal(假); d->s

我有一个显示QDialog的主窗口。当我将对话框窗口置于全屏时,它似乎并不总是工作,即使它似乎是一个合适的窗口。 这意味着,窗口可以全屏显示,尽管只是有时

有人有主意吗?我知道Qt声明它可能不适用于所有X环境,但它不会那么糟糕,不是吗

MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QDialog*d=新的QDialog();
d->setModal(假);
d->show();
qDebug()是窗口();
//大多数情况下都有效,但并非总是如此:
//d->showFullScreen();
//有时有效,有时无效:
QTimer::单镜头(2000,d,SLOT(showFullScreen());
}

我找到了一种有效的方法。我不知道为什么它比只调用
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();
    }

stackoverflow的DomTomCat展示了一种检测Ubuntu的方法,QDialog问题与Metacity(Ubuntu的默认窗口管理器)中的一个bug有关

Metacity管理对话框和主窗口的方式不同,它必须被欺骗,让它认为QDialog是一个普通窗口。为了使用QDialog类实现这一点,必须更改它的窗口标志

DomTomCat说,您可以检测会话,然后

//example inside the QDialog
this->setWindowFlags(Qt::Window);
this->showFullScreen();
这个bug以前被报告过(并被忽略),但据我所知,这是第一个简单的解决方法

Ubuntu也可以使用compiz。这可以在以下网址看到:

grep DefaultProvider-windowmanager /usr/share/gnome-session/sessions/*
致以最良好的祝愿


Iker De Echaniz。

谢谢,我现在可以测试它了,它就像一个符咒一样工作