¿Cómo puedo ocultar / eliminar el "?" botón de ayuda en la "barra de título" de un diálogo Qt?

81

Estoy usando Qt Dialogs en una de mis aplicaciones. Necesito ocultar / eliminar el botón de ayuda. Pero no puedo localizar exactamente dónde consigo el control de su botón de ayuda. No estoy seguro de si es una bandera en particular en la ventana de Qt.

AMM
fuente

Respuestas:

65

De forma predeterminada, la marca Qt :: WindowContextHelpButtonHint se agrega a los diálogos. Puede controlar esto con el parámetro WindowFlags del constructor de diálogo.

Por ejemplo, puede especificar solo las banderas TitleHint y SystemMenu haciendo:

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

Si agrega el indicador Qt :: WindowContextHelpButtonHint , recuperará el botón de ayuda.

En PyQt puedes hacer:

from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
d = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint | QtCore.Qt.WindowTitleHint)
d.exec_()

Se pueden encontrar más detalles sobre las banderas de ventana en la enumeración WindowType en la documentación de Qt.

amos
fuente
7
Vea la respuesta de rrwick a continuación. Si no agrega Qt :: WindowCloseButtonHint a sus banderas, habrá deshabilitado el botón de cierre, que por defecto está habilitado.
Dan
1
Aquí hay un enlace que especifica los indicadores de ventana en PyQt4, pyqt.sourceforge.net/Docs/PyQt4/qt.html#WindowType-enum
Barmaley
4
También agregue la bandera Qt::WindowCloseButtonHintsi desea que se active el botón de cierre.
Donald Duck
1
Pude configurarlo QtCore.Qt.WindowCloseButtonHinty lo eliminé QtCore.Qt.WindowTitleHint. Supongo que la configuración de los indicadores anula los indicadores predeterminados, por lo que debe especificar todos los indicadores que desee.
Artomason
Vea también la respuesta de @Parker Coates a continuación para saber cómo eliminar el '?' globalmente con una sola línea, desde Qt 5.10 en adelante
Clare Macrae
51
// remove question mark from the title bar
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Jens A. Koch
fuente
32

Ok, encontré una manera de hacer esto.

Se ocupa de las banderas de la ventana. Así que aquí está el código que utilicé:

Qt::WindowFlags flags = windowFlags()

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

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

Pero al hacer esto, a veces se restablece el icono del cuadro de diálogo. Entonces, para asegurarse de que el icono del cuadro de diálogo no cambie, puede agregar dos líneas.

QIcon icon = windowIcon();

Qt::WindowFlags flags = windowFlags();

Qt::WindowFlags helpFlag =
Qt::WindowContextHelpButtonHint;

flags = flags & (~helpFlag);   

setWindowFlags(flags);

setWindowIcon(icon);
AMM
fuente
30
Versión más corta:setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
Thorbjørn Lindeijer
2
@ ThorbjørnLindeijer: Debería agregar esto como respuesta.
Hossein
27

A partir de Qt 5.10, puede desactivar estos botones globalmente con un solo QApplicationatributo.

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

Me encontré con este problema en Windows 7, Qt 5.2, y la combinación de indicadores que funcionó mejor para mí fue esta:

Qt :: WindowTitleHint | Qt :: WindowCloseButtonHint

Esto me da un botón de cierre que funciona pero no un botón de ayuda con el signo de interrogación. Usar solo Qt :: WindowTitleHint o Qt :: WindowSystemMenuHint eliminó el botón de ayuda, pero también deshabilitó el botón de cierre.

Como sugirió Michael Bishop, fue jugar con el ejemplo de las banderas de ventana lo que me llevó a esta combinación. ¡Gracias!

rrwick
fuente
1
Esta es la respuesta correcta. Las respuestas anteriores deshabilitan el botón de cierre, que de forma predeterminada no está deshabilitado.
Dan
4

Las respuestas enumeradas aquí funcionarán, pero para responderlas usted mismo, le recomiendo que ejecute el programa de ejemplo $QTDIR/examples/widgets/windowflags. Eso le permitirá probar todas las configuraciones de banderas de ventana y sus efectos. Muy útil para resolver problemas de banderas de ventana de ardilla.

Michael Bishop
fuente
2

Se puede utilizar la siguiente forma de eliminar los signos de interrogación de forma predeterminada para todos los cuadros de diálogo de la aplicación:

Adjunte el siguiente filtro de eventos en QApplicationalgún lugar al comienzo de su 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);
  }
Predelnik
fuente
0

No pude encontrar una ranura, pero puede anular la winEventfunción virtual .

#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
brandoneggar
fuente