2

(Qt4.8およびUbuntu12.10Unityでの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()));
}
4

2 に答える 2

6

ここstackoverflowのDomTomCatは、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/*

よろしくお願いします、

Iker De Echaniz

于 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 に答える