2009-10-20 10 views
5

Quiero ser capaz de evitar que un usuario mueva un QSplitter en tiempo de ejecución. Llamar al setEnabled(false) hace esto, pero también deshabilita todos los widgets secundarios, que no es lo que quiero. ¿Hay una manera de lograr esto? ¿Debo desactivar el divisor y luego volver a habilitar manualmente todos los widgets secundarios? Eso parece bastante engorroso, para algo que debe ser una práctica razonablemente común.Qt splitter disable

¿Alguien puede sugerir algo?

Respuesta

1

En realidad, nunca he visto a nadie deshabilitar un divisor: están ahí para que el usuario pueda diseñar la interfaz de usuario como lo necesita, entonces ¿por qué alguien querría deshabilitar esto? O necesita un divisor o puede usar uno de los diseños normales (que el usuario no puede redimensionar).

Si aún quieres probar, creo que deberías mirar closestLegalPosition() o getRange(). Si solo devuelve el ancho del widget, el cambio de tamaño debería dejar de funcionar.

+1

supongo que va a ser la forma más fácil - el caso de uso es la siguiente: Tengo una interfaz de usuario, que se puede poner en un cierto modo, en el que uno de los niños del divisor widgets desaparece. En ese caso, no quiero que el usuario pueda mover el divisor, ya que solo hay un widget en un lado, ¿tiene sentido? – Thomi

+0

Impar Supongo que el divisor no ofrecería un elemento de arrastre cuando solo tiene un hijo. ¿Puedes verificar que realmente solo hay un solo hijo? –

+0

Bueno, en realidad no se puede eliminar un widget del separador: la API pública de QSplitter no proporciona un método para hacerlo. Lo mejor que puedes lograr es esconder a los niños. ¿Algunas ideas? – Thomi

0

Tienes que hacer dos cosas. Establezca los widgets (que no deberían ser redimensionables) dentro del divisor en FixedSize y cambie el cursor de los controladores del divisor correspondiente al Qt::ArrowCursor. Los mangos comienzan con cero (usado izquierda y no), por lo que el primer mango entre dos widgets es por el índice 1.

He aquí una muestra (poner el código en main.cpp):

#include <QtGui> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget window; 
    window.resize(800, 300); 
    window.setWindowTitle("Splitter Test"); 
    window.show(); 

    QSplitter *splitter = new QSplitter(&window); 
    QListView *listview = new QListView; 
    QTreeView *treeview = new QTreeView; 
    QTextEdit *textedit = new QTextEdit; 

    splitter->addWidget(listview); 
    splitter->addWidget(treeview); 
    splitter->addWidget(textedit); 
    splitter->setChildrenCollapsible(false); 

    splitter->show(); 
    listview->show(); 
    treeview->show(); 
    textedit->show(); 

    //make the lisview 'fix' 
    listview->setFixedSize(listview->width(), listview->height()); 
    //change the cursor over the splitter handle between listview and 
    //treeview to ArrowCursor 
    splitter->handle(1)->setCursor(Qt::ArrowCursor);; 

    return app.exec(); 
} 

Ahora el el primer manipulador del divisor es disabled y el segundo funciona.

10

Haga lo siguiente:

for (int i = 0; i < splitter->count(); i++) 
{ 
    QSplitterHandle *hndl = splitter->handle(i); 
    hndl->setEnabled(false); 
}