1

アプリケーションに長方形以外のポップアップ ウィジェットがあります。

それらのクラスは、その透明性を実現するために次を定義します。

setAttribute(Qt::WA_NoSystemBackground, true);
setAttribute(Qt::WA_TranslucentBackground, true);

私も使用します:

 this->setWindowFlags(Qt::Popup| Qt::FramelessWindowHint);

問題は、Windows 7 で、ウィンドウの下部と右側に自動的に「影」が描画されることです。これは非常に望ましくありません。

そこで、Qt::Popup の代わりに Qt::Tool を使ってみました

 this->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);

これは視覚的に機能します。影はありませんが、Qt::Popup の場合のように、ウィジェット ウィンドウの外側でマウス クリックしても自動的に閉じる/非表示になりません。

したがって、次の 2 つのソリューションのいずれかが必要です。

  1. Qt::Popup使用して、Windows の自動シャドウ装飾を取り除く方法
  2. Qt::Tool ウィンドウの外側でマウス クリックが発生するようにする方法。

1 つのメモ: 私のアプリケーションは、Windows XP 以降用に構築されています。Vista/Win7 のみのランタイム DLL を使用することも、「Windows XP」と「Vista 以降」の個別のビルドを使用することもできません。

どんなアドバイスでも大歓迎です。

4

4 に答える 4

1

最後に、「SetFocusPolicy」呼び出しの量が Qt::Tool ウィンドウのこれらのイベントを受け取ることを許可しないことに気付いた後、問題を解決するために別の方法に頼りました:

  1. Qt::Popup が望ましくないシャドウ効果を引き起こし、所有者の描画フレームを傷つけたため、Qt:tool を保持しました。このスタイルを Qt で削除することはできず、プラットフォーム固有の条件付きコードを台無しにしたくありませんでした。
  2. Qt::tool ウィンドウにイベント フィルターをインストールすると、アプリケーションの他の部分がクリックされたときや、アプリケーション自体が別のアプリケーションにフォーカスを失ったときに理解するのに役立つイベントを受け取り始めました。これは、機能的に必要なものでした。ユーザーがアプリケーションのメイン ウィンドウの非クライアント領域 (ウィンドウのキャプションなど) をクリックしたときにイベントを取得して、ドラッグが開始されたときに閉じることができるようにすることもできます。
于 2013-05-12T23:21:09.607 に答える
1

Windows 7 の私のソリューション:

QDialog *d = new QDialog;
d->setStyleSheet("background:transparent;");
d->setAttribute(Qt::WA_DeleteOnClose, true);
d->setAttribute(Qt::WA_TranslucentBackground, true);
#ifdef Q_OS_WIN
d->createWinId();
#endif
d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
d->show();
于 2013-08-14T12:45:14.070 に答える
0

QListViewを設定しました

d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);

eventfilter をインストールし、MousePressEvent を使用して qlistview ウィジェットを非表示にしました。

リストの MousePressEvent は、私がデバッグしなかった他のイベントを生成するフィルターになることはありません。

したがって、オートコンプリータを設計したい場合、これは完璧です。Qt5.3.1 でテスト済み。

于 2014-07-14T14:36:59.187 に答える