Як я можу приховати / видалити “?” кнопка довідки на рядку заголовка діалогового вікна Qt?


81

Я використовую діалогові вікна Qt в одному зі своїх додатків. Мені потрібно приховати / видалити кнопку довідки. Але я не можу знайти, де саме я отримую ручку до його кнопки довідки. Не впевнений, що це конкретний прапор у вікні Qt.

Відповіді:


64

За замовчуванням прапор 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.


7
Дивіться відповідь rrwick нижче. Якщо ви не додасте Qt :: WindowCloseButtonHint до своїх прапорів, ви вимкнете кнопку закриття, яка за замовчуванням увімкнена.
Ден

1
Ось посилання, що вказує прапори вікон у PyQt4
Barmaley,

4
Також додайте прапор, Qt::WindowCloseButtonHintякщо хочете, щоб була закрита кнопка закриття.
Дональд Дак,

1
Я зміг просто встановити QtCore.Qt.WindowCloseButtonHintі його видалити QtCore.Qt.WindowTitleHint. Я припускаю, що встановлення прапорів замінює прапори за замовчуванням, тому вам потрібно вказати всі потрібні вам прапори.
artomason

Дивіться також відповідь @Parker Coates нижче про те, як видалити знак "?" у всьому світі з одноклассником, починаючи з Qt 5.10 і далі
Клер Макре

54
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

1
Це має бути прийнятою відповіддю, оскільки вона зберігає встановлені раніше прапори.
камповскі

32

Гаразд, я знайшов спосіб це зробити.

Це стосується прапорців Window. Отже, ось код, який я використав:

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

30
Коротша версія:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer

2
@ ThorbjørnLindeijer: Ви повинні додати це як відповідь.
Хоссейн

28

Починаючи з Qt 5.10, ви можете вимкнути ці кнопки глобально за допомогою одного QApplicationатрибута!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

1
Дуже корисно, дякую. Однак неправильно, якщо ви хочете змінити його на основі кожного діалогового вікна (не в моєму випадку, тому я використав ваше рішення).
камповскі

15

Я зіткнувся з цією проблемою в Windows 7, Qt 5.2, і найкраща комбінація прапорів для мене:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Це дає мені робочу кнопку закриття, але жодної кнопки довідки про знак питання. Використовуючи лише Qt :: WindowTitleHint або Qt :: WindowSystemMenuHint, ми позбулися кнопки довідки, але також вимкнули кнопку закриття.

Як запропонував Майкл Бішоп, саме гра з прикладом віконних флагів призвела мене до цієї комбінації. Дякую!


1
Це правильна відповідь. Наведені вище відповіді вимикають кнопку закриття, яка за замовчуванням не вимикається.
Ден

4

Перелічені тут відповіді будуть працювати, але щоб відповісти на них самостійно, я рекомендую вам запустити приклад програми $QTDIR/examples/widgets/windowflags. Це дозволить вам протестувати всі конфігурації прапорів вікон та їх ефекти. Дуже корисно для з’ясування проблем з білосніжними віконцями.


2

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

Прикріпіть такий фільтр подій 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

Я не зміг знайти слот, але ви можете замінити віртуальну 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.