Como posso esconder/excluir o "?" Botão de ajuda na "barra de título" de uma caixa de diálogo QT?
Pergunta
Estou usando o Qt Dialogs em um dos meus aplicativos.Preciso ocultar/excluir o botão de ajuda.Mas não consigo localizar exatamente onde consigo o botão de ajuda.Não tenho certeza se é um sinalizador específico na janela do Qt.
Solução
Por padrão o Qt :: WindowContexThelpButtonHint O sinalizador é adicionado às caixas de diálogo. Você pode controlar isso com o Windowsflags parâmetro para o construtor de diálogo.
Por exemplo, você pode especificar apenas o Titlehint e SystemMenu bandeiras fazendo:
QDialog *d = new QDialog(0, Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
d->exec();
Se você adicionar o Qt :: WindowContexThelpButtonHint Sinalizador você receberá o botão de ajuda de volta.
Em Pyqt, você pode fazer:
from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
d = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
d.exec_()
Mais detalhes sobre sinalizadores de janelas podem ser encontrados no Windowtype Enum na documentação do QT.
Outras dicas
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Ok, eu encontrei uma maneira de fazer isso.
Ele lida com as bandeiras da janela. Então, aqui está o código que usei:
Qt::WindowFlags flags = windowFlags()
Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;
flags = flags & (~helpFlag);
setWindowFlags(flags);
Mas, ao fazer isso, às vezes, o ícone da caixa de diálogo é redefinido. Portanto, para garantir que o ícone da caixa de diálogo não mude, você pode adicionar duas linhas.
QIcon icon = windowIcon();
Qt::WindowFlags flags = windowFlags();
Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;
flags = flags & (~helpFlag);
setWindowFlags(flags);
setWindowIcon(icon);
Eu encontrei esse problema no Windows 7, Qt 5.2, e a combinação de bandeiras que funcionou melhor para mim foi a seguinte:
Qt :: windowtitlehint | Qt :: WindowCloseButtonHint
Isso me dá um botão de fechamento, mas sem botão de ajuda do ponto de interrogação. Usando apenas qt :: windowtitlehint ou qt :: windowsystemmenuhint se livrou do botão Ajuda, mas também desativou o botão Fechar.
Como Michael Bishop sugeriu, estava brincando com o exemplo do Windowsflags que me levou a essa combinação. Obrigado!
A partir do qt 5.10, você pode desativar esses botões globalmente com um único QApplication
atributo!
QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
As respostas listadas aqui funcionarão, mas para responder, eu recomendo que você execute o programa de exemplo $QTDIR/examples/widgets/windowflags
. Isso permitirá que você teste todas as configurações das bandeiras de janelas e seus efeitos. Muito útil para descobrir problemas de flags de vidraças do Squirredy.
A seguinte maneira de remover pontos de interrogação por padrão para todas as caixas de diálogo no aplicativo pode ser usada:
Anexe o seguinte filtro de eventos a QApplication
Em algum lugar no início do seu programa:
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);
}
Não consegui encontrar um slot, mas você pode substituir o virtual winEvent
função.
#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