it-swarm-pt.tech

Como ocultar / excluir o "?" botão de ajuda na "barra de título" de um Qt Dialog?

Estou usando Qt Dialogs em um dos meus aplicativos. Preciso ocultar/excluir o botão de ajuda. Mas não sou capaz de localizar onde exatamente encontro o botão de ajuda dele. Não tenho certeza se é uma bandeira específica na janela Qt.

69
AMM

Por padrão, o sinalizador Qt :: WindowContextHelpButtonHint é adicionado às caixas de diálogo. Você pode controlar isso com o parâmetro WindowFlags para o construtor de diálogo.

Por exemplo, você pode especificar apenas os sinalizadores TitleHint e SystemMenu fazendo:

QDialog *d = new QDialog(0, Qt::WindowSystemMenuHint | Qt::WindowTitleHint);
d->exec();

Se você adicionar o sinalizador Qt :: WindowContextHelpButtonHint, você receberá o botão de ajuda novamente.

No 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 os sinalizadores de janela podem ser encontrados no WindowType enum na documentação do Qt.

61
amos
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
37
Jens A. Koch

Ok, eu encontrei uma maneira de fazer isso.

Ele lida com os sinalizadores de janela. Então, aqui está o código que eu usei:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   
setWindowFlags(flags);

Mas, ao fazer isso, algumas vezes o ícone da caixa de diálogo é redefinido. Portanto, para garantir que o ícone da caixa de diálogo não seja alterado, você pode adicionar duas linhas.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
31
AMM

A partir do Qt 5.10, você pode desativar esses botões globalmente com um único atributo QApplication!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
15
Parker Coates

Eu me deparei com esse problema no Windows 7, Qt 5.2, e a combinação de sinalizadores que funcionou melhor para mim foi a seguinte:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Isso me dá um botão fechar de trabalho, mas nenhum botão de ajuda do ponto de interrogação. Usando apenas Qt :: WindowTitleHint ou Qt :: WindowSystemMenuHint se livrou do botão de ajuda, mas também desabilitou o botão Fechar.

Como Michael Bishop sugeriu, foi brincar com o exemplo das janelas que me levou a essa combinação. Obrigado!

13
rrwick

As respostas listadas aqui funcionarão, mas para responder você mesmo, recomendo que você execute o programa de exemplo $QTDIR/examples/widgets/windowflags. Isso permitirá que você teste todas as configurações de sinalizadores de janela e seus efeitos. Muito útil para descobrir problemas de marcas de janela esquilos.

4
Michael Bishop

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);
  }
2
Predelnik

Não consegui encontrar um slot, mas você pode substituir a função virtual 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
0
brandoneggar