2010-01-13 17 views
5

Tengo una ventana flotante para herramientas. Funciona bien en Windows, pero no puedo obtener deshacerse del botón Maximizar en Mac OS X. He intentado desarmar Qt::WindowMaximizeButtonHint y establecer la ventana en tamaño fijo. Parece que nada funciona.Cómo eliminar el botón Maximizar en la ventana de la herramienta Mac OS X en Qt

MyWidget::MyWidget(QWidget* parent) 
:QWidget(parent, Qt::Tool | Qt::CustomizeWindowHint) 
{ 
    setupUi(this); 

    setFixedSize(sizeHint()); // doesn't remove maximise button 
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint); // doesn't remove maximise button 
} 

No quiero usar una ventana sin marco. ¿Algunas ideas? Estoy usando Qt 4.4.

Respuesta

4

Este código de Richard Gustavsen de Nokia trabaja en Qt 4.4:

class MyWidget : public QWidget 
{ 
    public: 

    MyWidget::MyWidget(QWidget* parent) : QWidget(parent, Qt::Tool) 
    { 
    } 

    void setVisible(bool visible) 
    { 
     QWidget::setVisible(visible); 
     ChangeWindowAttributes(qt_mac_window_for(this), kWindowNoAttributes, kWindowFullZoomAttribute); 
    } 
}; 

Gracias Richard y Nokia!

+0

¿Por qué no puedo encontrar ChangeWindowAttributes con qt 4.8 64 bit build? – ldlchina

3

Usted podría tratar de establecer el indicador de ventana para incluir Qt::Dialog (negrita añadida):

Indica que el widget es una ventana que debe ser decorado como un cuadro de diálogo (es decir, típicamente no maximizar o minimizar botones de la barra de título). Este es el tipo predeterminado para QDialog. Si desea usarlo como cuadro de diálogo modal, debe iniciarse desde otra ventana, o tener un elemento principal y usarse con la propiedad QWidget :: windowModality. Si lo hace modal, el cuadro de diálogo evitará que otras ventanas de nivel superior en la aplicación obtengan alguna entrada. Nos referimos a una ventana de nivel superior que tiene un padre como ventana secundaria.

No sé qué pasaría si se trató de establecer tanto Qt::Dialog y Qt::Tool, pero podría valer la pena investigar.

+0

Intentó ambos Qt :: Dialog | Qt :: Tool y Qt :: Dialog. ¡Todavía tenía un botón de maximizar en ambos casos! –

9

Ejecute la aplicación de ejemplo Qt windowflags. Elija Tool botón de opción y después comprobar:

  • título de la ventana
  • ventana Personalizar
  • ventana botón de cierre

Es la única manera que encontré en Mac OS X para lograr lo que usted quiere solamente usted perderá el botón de minimizar. No hay otra manera. Esa es la limitación de Mac OS X Window Manager.

En resumen, sólo hay cinco grupos de botones en la barra de título:

  1. Todos los botones visibles y todos los botones habilitados: setWindowFlags(Qt::Tool)
  2. Todos los botones botón sea visible, cerrar y maximizar botones está activado, minimizar deshabilitado: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  3. Todos los botones visibles, maximizar el botón activado, cierre y minimizar los discapacitados: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint | Qt::CustomizeWindowHint)
  4. Sólo botón de cierre es visible y habilitado setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
  5. No hay botones en la barra de título: setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint)
+0

Kamil, Excelente respuesta. Desafortunadamente, parece que Qt :: WindowCloseButtonHint no está disponible en Qt 4.4. –

+0

Perdón por eso, pero actualmente estoy usando Qt 4.6, pero mi intención era hacer que ejecutaras el ejemplo de ventanas de Qt, por lo que pudiste probar la mayoría de las opciones de manera fácil y rápida. –

+0

He intentado el ejemplo de windowflags en Qt 4.4, pero no pude no encuentro una combinación que elimine el botón Maximizar. –

1

que era capaz de hacerlo con

setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint | Qt::WindowMinimizeButtonHint) 
2

Aquí es una forma de plataforma cruzada para hacerlo. Ha anulado su método setVisible de su QMainWindow o QWidget. De la misma manera, cualquier indicador de ventana puede modificarse y tener un impacto visual en la ventana.

La razón por la que esto tiene que hacerse de esta manera es que la clase necesita tener especificaciones de ventana antes de mostrar la ventana.

void setVisible(bool visible) 
{ 
    setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint); 
    QWidget::setVisible(visible); 
} 
+0

Esta es una buena respuesta, ya que no desarma ningún indicador de ventana previamente configurado. – Oszkar

Cuestiones relacionadas