Как я могу скрыть / удалить кнопку справки “?” в “строке заголовка” диалогового окна Qt?

StackOverflow https://stackoverflow.com/questions/81627

  •  09-06-2019
  •  | 
  •  

Вопрос

Я использую диалоговые окна 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top