Как я могу скрыть / удалить кнопку справки “?” в “строке заголовка” диалогового окна Qt?
Вопрос
Я использую диалоговые окна Qt в одном из своих приложений.Мне нужно скрыть / удалить кнопку справки.Но я не могу определить, где именно я получаю доступ к его кнопке справки.Не уверен, есть ли определенный флаг в окне Qt.
Решение
По умолчанию используется Qt::WindowContextHelpButtonHint флаг добавляется в диалоги.Вы можете контролировать это с помощью Стеклопакеты параметр для конструктора диалогового окна.
Например, вы можете указать только Заголовок отсутствует и 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_()
Более подробную информацию о флагах окон можно найти на Перечисление WindowType в документации Qt.
Другие советы
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Хорошо, я нашел способ сделать это.
Это действительно имеет дело с флагами окон.Итак, вот код, который я использовал:
Qt::WindowFlags flags = windowFlags()
Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;
flags = flags & (~helpFlag);
setWindowFlags(flags);
Но при этом иногда значок диалогового окна сбрасывается.Таким образом, чтобы убедиться, что значок диалогового окна не изменится, вы можете добавить две строки.
QIcon icon = windowIcon();
Qt::WindowFlags flags = windowFlags();
Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;
flags = flags & (~helpFlag);
setWindowFlags(flags);
setWindowIcon(icon);
Я столкнулся с этой проблемой в Windows 7, Qt 5.2, и комбинация флагов, которая лучше всего подходила для меня, была такой:
Qt::WindowTitleHint | Qt::WindowCloseButtonHint
Это дает мне рабочую кнопку закрытия, но без кнопки справки со знаком вопроса.Используя только Qt:: WindowTitleHint или Qt:: WindowSystemMenuHint, мы избавились от кнопки справки, но также отключили кнопку закрытия.
Как предположил Майкл Бишоп, именно игра с примером windowflags привела меня к этой комбинации.Спасибо!
Начиная с Qt 5.10, вы можете отключить эти кнопки глобально с помощью одного QApplication
атрибут!
QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
Приведенные здесь ответы будут работать, но чтобы ответить на них самостоятельно, я бы порекомендовал вам запустить программу-пример $QTDIR/examples/widgets/windowflags
.Это позволит вам протестировать все конфигурации оконных флагов и их эффекты.Очень полезно для выяснения проблем с squirrelly windowflags.
Можно использовать следующий способ удаления вопросительных знаков по умолчанию для всех диалоговых окон в приложении:
Прикрепите следующий фильтр событий к 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