2

(在 Qt 4.8 和 Ubuntu 12.10 上使用 C++ 进行测试)

我有一个显示 QDialog 的主窗口。当我将 Dialog 窗口全屏显示时,它似乎并不总是有效,即使它似乎是一个正确的窗口。意思是,窗口可以全屏显示,尽管只是有时。

有人有想法吗?我知道 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()));
}
4

2 回答 2

6

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/*

此致,

伊克尔·德·埃卡尼兹。

于 2014-06-06T09:42:39.347 回答
2

我找到了一种可行的方法。我不知道为什么它与调用相比有效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();
    }
于 2013-03-24T16:35:52.297 回答