¿Cómo puedo esconder/eliminar el "?" ¿Botón de ayuda en la "barra de título" de un diálogo QT?

StackOverflow https://stackoverflow.com/questions/81627

  •  09-06-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

Por defecto el Qt::WindowContextHelpButtonHint La bandera se agrega a los cuadros de diálogo.Puedes controlar esto con el Banderas de ventana parámetro al constructor de diálogo.

Por ejemplo, puede especificar sólo el TítuloPista y Menu del sistema banderas haciendo:

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

Si agregas el Qt::WindowContextHelpButtonHint bandera, 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 Enumeración de tipo de ventana en la documentación de Qt.

Otros consejos

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

Ok, encontré una manera de hacer esto.

Se ocupa de las banderas de 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 el icono del cuadro de diálogo se restablece.Entonces, para asegurarse de que el ícono 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);

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 signo de interrogación.Usando solo Qt::WindowTitleHint o Qt::WindowSystemMenuHint eliminó el botón de ayuda, pero también deshabilitó el botón de cerrar.

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

A partir de Qt 5.10, puede desactivar estos botones globalmente con un solo QApplication ¡atributo!

QApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);

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 los indicadores de ventana y sus efectos.Muy útil para descubrir problemas de banderas de ventanas ardillas.

Se podría 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 a QApplication en algú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);
  }

No pude encontrar un espacio, pero puedes anular el virtual. winEvent función.

#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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top