Как я могу скрыть / удалить "?" кнопка справки на "строке заголовка" Qt Dialog? - PullRequest
64 голосов
/ 17 сентября 2008

Я использую Qt Dialogs в одном из моих приложений. Мне нужно скрыть / удалить кнопку справки. Но я не могу найти, где именно я получаю ручку к его кнопке помощи. Не уверен, что это определенный флаг в окне Qt.

Ответы [ 8 ]

57 голосов
/ 17 сентября 2008

По умолчанию в диалоги добавляется флаг 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_()

Более подробную информацию о флагах окон можно найти в перечислении WindowType в документации Qt.

34 голосов
/ 19 июня 2015
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
31 голосов
/ 17 сентября 2008

Хорошо, я нашел способ сделать это.

Это касается оконных флагов. Итак, вот код, который я использовал:

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);
13 голосов
/ 18 апреля 2018

Начиная с Qt 5.10, вы можете отключить эти кнопки глобально с помощью одного атрибута QApplication!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
13 голосов
/ 26 февраля 2014

Я столкнулся с этой проблемой в Windows 7, Qt 5.2, и комбинация флагов, которая лучше всего работала для меня, была такой:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Это дает мне работающую кнопку закрытия, но без кнопки справки с вопросительным знаком. Использование только Qt :: WindowTitleHint или Qt :: WindowSystemMenuHint избавило от кнопки справки, но также отключило кнопку закрытия.

Как предположил Майкл Бишоп, именно игра с примером оконных флагов привела меня к этой комбинации. Спасибо!

4 голосов
/ 11 декабря 2008

Ответы, перечисленные здесь, будут работать, но чтобы ответить на них самостоятельно, я бы порекомендовал вам запустить пример программы $QTDIR/examples/widgets/windowflags. Это позволит вам протестировать все конфигурации оконных флагов и их эффекты. Очень полезно для выяснения коротких проблем с флагами окон.

2 голосов
/ 29 августа 2017

Можно использовать следующий способ удаления вопросительных знаков по умолчанию для всех диалогов в приложении:

Присоедините следующий фильтр событий к 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 голосов
/ 29 сентября 2010

Я не смог найти слот, но вы можете переопределить виртуальную функцию 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
...