「?」を非表示/削除するにはどうすればよいですか?Qtダイアログの「タイトルバー」のヘルプボタン?


81

アプリケーションの1つでQtダイアログを使用しています。ヘルプボタンを非表示/削除する必要があります。しかし、彼のヘルプボタンのハンドルを正確にどこで取得できるかを見つけることができません。Qtウィンドウの特定のフラグかどうかはわかりません。

回答:


64

デフォルトでは、Qt :: WindowContextHelpButtonHintフラグがダイアログに追加されます。これは、ダイアログコンストラクターのWindowFlagsパラメーターを使用して制御できます。

たとえば、次のようにしてTitleHintフラグとSystemMenuフラグのみを指定できます。

QDialog *d = new QDialog(0, Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
d->exec();

Qt :: WindowContextHelpButtonHintフラグを追加すると、ヘルプボタンが元に戻ります。

PyQtでは次のことができます:

from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
d = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
d.exec_()

ウィンドウフラグの詳細については、QtドキュメントのWindowType列挙型を参照してください。


7
以下のrrwickの回答を参照してください。Qt :: WindowCloseButtonHintをフラグに追加しない場合、閉じるボタンが無効になります。これはデフォルトで有効になっています。
ダン

1
PyQt4のウィンドウフラグを指定するリンクは次のとおりです。pyqt.sourceforge.net
Docs /

4
またQt::WindowCloseButtonHint、閉じるボタンをアクティブにする場合は、フラグを追加します。
ドナルドダック

1
設定するだけQtCore.Qt.WindowCloseButtonHintで削除されましたQtCore.Qt.WindowTitleHint。フラグを設定するとデフォルトのフラグが上書きされると思いますので、必要なすべてのフラグを指定する必要があります。
artomason 2017

'?'を削除する方法については、以下の@ParkerCoatesの返信も参照してください。Qt 5.10以降、ワンライナーで世界的に
Clare Macrae 2018

54
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

1
これは、以前に設定されたフラグを保持するため、受け入れられる答えであるはずです。
campovski

32

わかりました、私はこれを行う方法を見つけました。

ウィンドウフラグを処理します。だからここに私が使用したコードがあります:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   
setWindowFlags(flags);

ただし、これを行うと、ダイアログのアイコンがリセットされることがあります。したがって、ダイアログのアイコンが変更されないようにするために、2行を追加できます。

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);

30
短いバージョン:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
するThorbjörnLindeijer

2
@ThorbjørnLindeijer:これを答えとして追加する必要があります。
ホセイン2012

28

Qt 5.10以降、これらのボタンを1つのQApplication属性でグローバルに無効にできます。

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

1
とても助かりました、ありがとう。ただし、ダイアログごとに変更する場合は正しくありません(私の場合ではないので、ソリューションを使用しました)。
campovski

15

私はWindows7、Qt 5.2でこの問題に遭遇しました、そして私にとって最もうまくいったフラグの組み合わせはこれでした:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

これにより、閉じるボタンは機能しますが、疑問符のヘルプボタンは表示されません。Qt :: WindowTitleHintまたはQt :: WindowSystemMenuHintだけを使用すると、ヘルプボタンが削除されましたが、閉じるボタンも無効になりました。

マイケルビショップが示唆したように、それは私をこの組み合わせに導いたウィンドウフラッグの例で遊んでいました。ありがとう!


1
これが正解です。上記の回答は、デフォルトでは無効になっていない閉じるボタンを無効にします。
ダン

4

ここにリストされている答えは機能しますが、自分で答えるには、サンプルプログラムを実行することをお勧めします$QTDIR/examples/widgets/windowflags。これにより、ウィンドウフラグのすべての構成とその効果をテストできます。リスのウィンドウフラグの問題を理解するのに非常に便利です。


2

アプリケーションのすべてのダイアログでデフォルトで疑問符を削除するには、次の方法を使用できます。

QApplicationプログラムの開始時に、次のイベントフィルターをどこかに添付します。

  bool eventFilter (QObject *watched, QEvent *event) override
  {
    if (event->type () == QEvent::Create)
      {
        if (watched->isWidgetType ())
          {
            auto w = static_cast<QWidget *> (watched);
            w->setWindowFlags (w->windowFlags () & (~Qt::WindowContextHelpButtonHint));
          }
      }
    return QObject::eventFilter (watched, event);
  }

0

スロットが見つかりませんでしたが、仮想winEvent関数をオーバーライドできます。

#if defined(Q_WS_WIN)
bool MyWizard::winEvent(MSG * msg, long * result)
{
    switch (msg->message)
    {
    case WM_NCLBUTTONDOWN:
        if (msg->wParam == HTHELP)
        {

        }
        break;
    default:
        break;
    }
    return QWizard::winEvent(msg, result);
}
#endif
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.