web-dev-qa-db-ja.com

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

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

69
AMM

デフォルトでは、ダイアログに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 enum を参照してください。

61
amos
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
37
Jens A. Koch

OK、これを行う方法を見つけました。

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

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);
31
AMM

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

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
15
Parker Coates

私はWindows 7、Qt 5.2でこの問題に遭遇しましたが、私にとって最適なフラグの組み合わせは次のとおりです。

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

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

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

13
rrwick

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

4
Michael Bishop

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

次のイベントフィルターを、プログラムの開始時に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);
  }
2
Predelnik

スロットが見つかりませんでしたが、仮想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
0
brandoneggar