アプリケーションの1つでQtダイアログを使用しています。ヘルプボタンを非表示/削除する必要があります。しかし、彼のヘルプボタンのハンドルを正確にどこで取得できるかを見つけることができません。Qtウィンドウの特定のフラグかどうかはわかりません。
回答:
デフォルトでは、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列挙型を参照してください。
Qt::WindowCloseButtonHint
、閉じるボタンをアクティブにする場合は、フラグを追加します。
QtCore.Qt.WindowCloseButtonHint
で削除されましたQtCore.Qt.WindowTitleHint
。フラグを設定するとデフォルトのフラグが上書きされると思いますので、必要なすべてのフラグを指定する必要があります。
わかりました、私はこれを行う方法を見つけました。
ウィンドウフラグを処理します。だからここに私が使用したコードがあります:
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);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
私はWindows7、Qt 5.2でこの問題に遭遇しました、そして私にとって最もうまくいったフラグの組み合わせはこれでした:
Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint
これにより、閉じるボタンは機能しますが、疑問符のヘルプボタンは表示されません。Qt :: WindowTitleHintまたはQt :: WindowSystemMenuHintだけを使用すると、ヘルプボタンが削除されましたが、閉じるボタンも無効になりました。
マイケルビショップが示唆したように、それは私をこの組み合わせに導いたウィンドウフラッグの例で遊んでいました。ありがとう!
アプリケーションのすべてのダイアログでデフォルトで疑問符を削除するには、次の方法を使用できます。
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);
}
スロットが見つかりませんでしたが、仮想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