7

(編集を参照)

gnomeでQT/c++アプリケーションを開発しています。

アプリケーションのメインウィンドウとQListBoxの子ウィンドウ。

Altキーを押しながらアプリケーションから離れると、これらのウィンドウは両方とも別々のメインウィンドウとして表示されます。

私(または後でユーザー)がalt-tabを使用したときに1つのウィンドウだけが表示されるようにするにはどうすればよいですか?

この動作は、1つのメインウィンドウがサブウィンドウをクリップしないために発生すると推測しています。サブウィンドウはメインウィンドウの境界を拡張します。Gnomeは、他の多くのアプリケーションでもalt-tabの動作が悪く、メインウィンドウとは別にモーダルダイアログボックスが表示されます。しかし、私のアプリの場合、これは本当に迷惑です。

既存の両方の窓を含む巨大な透明な窓を作ることができると思います。しかし、「クリーンな」解決策を見つける方がよいでしょう。

(最も論理的な推測は、それがウィンドウフラグと関係があるということです。私は考えられるフラグのすべての合理的な組み合わせを試しました。ウィンドウタイプはここで説明されています)

編集:アプリのメインウィンドウ(QMainWindowではない)としてQWidgetがあります。QListViewはQWidgetオブジェクトに含まれており、メインウィンドウにポイントを渡すことで作成されます。Qt ::Tool|でスタイリングされています Qt::FramelessWindowHint。

Edit2: Qt :: X11BypassWindowManagerHintスタイル、alt-tabリストからウィンドウを削除するために機能します。問題は、ウィンドウが「管理されていない」状態になり、他のウィンドウをカバーすることです。集中力を失ったときはいつでも手作業で隠れることができました。より良い解決策を今すぐ賞賛してください。

4

2 に答える 2

3

ウィンドウのウィンドウを作成するときは、コンストラクターまたは後で関数呼び出しを使用しQListBoxてウィンドウフラグを設定します。ここにいくつかのコードスニペットがあります(私はヘッダーを省略しました):Qt::ToolsetWindowFlags

int main(int argc、char ** argv)
{{
    QApplication app(argc、argv);
    QMainWindow mw;
    mw.show();
    QWidget toolWindow(&mw、Qt :: Window | Qt :: Tool);
    QHBoxLayoutレイアウト(&toolWindow);
    toolWindow.setLayout(&layout);
    QListView lv(&toolWindow);
    layout.addWidget(&lv);
    toolWindow.show();

    app.exec();を返します。
}

新しく作成したユーザーを使用して、Debian sidボックス(Gnome 2.30、metacity 2.30.1)でこれをテストしました質問#3553428への回答の画像証明

これが希望どおりでない場合は、正しく動作するソフトウェアに名前を付けるか、自分で確認してください。これを行うにはxprop、ターミナルウィンドウで実行し、目的のウィンドウをクリックします。出力にはウィンドウフラグが含まれます。あなたが興味を持っているのはです_NET_WM_WINDOW_TYPE(ATOM)。ツールウィンドウ(つまり、alt-tabにリストされていない)の場合、このフラグは次のとおりです。

_NET_WM_WINDOW_TYPE(ATOM)= _NET_WM_WINDOW_TYPE_UTILITY、_NET_WM_WINDOW_TYPE_NORMAL

これらのフラグのあるウィンドウがツールボックスウィンドウでない場合は、ウィンドウマネージャーに問題があるか、そのような動作を個人的に設定しています。

于 2010-08-30T20:49:54.553 に答える
1

wmctrlツールを使用して手動で試すことができます。「-r-bSOMETHING」を使用すると、NET_WM引数を変更できます。[1]でこれらを試してください。

これが機能する場合は、Xlib-Callsを使用してそれらを追加できます(QtからX11ウィンドウ番号を知ることができれば、それは可能だと確信しています)。

[1] http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html
于 2010-09-02T09:23:22.080 に答える