Я використовую діалогові вікна 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_()
Детальніше про прапори вікон можна знайти в переліку WindowType у документації Qt.
Qt::WindowCloseButtonHint
якщо хочете, щоб була закрита кнопка закриття.
QtCore.Qt.WindowCloseButtonHint
і його видалити QtCore.Qt.WindowTitleHint
. Я припускаю, що встановлення прапорів замінює прапори за замовчуванням, тому вам потрібно вказати всі потрібні вам прапори.
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Гаразд, я знайшов спосіб це зробити.
Це стосується прапорців 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);
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Починаючи з Qt 5.10, ви можете вимкнути ці кнопки глобально за допомогою одного QApplication
атрибута!
QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
Я зіткнувся з цією проблемою в Windows 7, Qt 5.2, і найкраща комбінація прапорів для мене:
Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint
Це дає мені робочу кнопку закриття, але жодної кнопки довідки про знак питання. Використовуючи лише Qt :: WindowTitleHint або Qt :: WindowSystemMenuHint, ми позбулися кнопки довідки, але також вимкнули кнопку закриття.
Як запропонував Майкл Бішоп, саме гра з прикладом віконних флагів призвела мене до цієї комбінації. Дякую!
Перелічені тут відповіді будуть працювати, але щоб відповісти на них самостійно, я рекомендую вам запустити приклад програми $QTDIR/examples/widgets/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