2009-10-20 5 views
5

Je souhaite être en mesure d'empêcher un utilisateur de déplacer un QSplitter lors de l'exécution. Appeler setEnabled(false) fait cela, mais il désactive également tous les widgets enfants - ce qui n'est pas ce que je veux. Y a-t-il un moyen d'y parvenir? Dois-je désactiver le séparateur, puis réactiver manuellement tous les widgets enfants? Cela semble plutôt lourd, pour quelque chose qui doit être une pratique raisonnablement courante.Qt splitter disable

Quelqu'un peut-il suggérer quelque chose?

Répondre

1

En fait, je n'ai jamais vu quelqu'un jamais désactiver un séparateur: Ils sont là pour que l'utilisateur peut mettre en forme l'interface utilisateur comme elle le souhaite, alors pourquoi voudrait-on désactiver cela? Soit vous avez besoin d'un séparateur ou vous pouvez utiliser l'une des mises en page normales (que l'utilisateur ne peut pas redimensionner). Si vous voulez toujours essayer, je pense que vous devriez regarder closestLegalPosition() ou getRange(). Si vous renvoyez simplement la largeur du widget, le redimensionnement devrait cesser de fonctionner.

+1

Je suppose que ça va être la meilleure façon - le cas d'utilisation est la suivante: Je ui, qui peut être mis dans un certain mode, dans lequel l'un de l'enfant du séparateur les widgets disparaissent. Dans ce cas, je ne veux pas que l'utilisateur puisse déplacer le séparateur, puisqu'il n'y a qu'un widget d'un côté - est-ce logique? – Thomi

+0

Impair. Je suppose que le séparateur n'offrirait pas un élément de traînée quand il n'a qu'un seul enfant. Pouvez-vous vérifier qu'il n'y a vraiment qu'un seul enfant? –

+0

Eh bien, vous ne pouvez pas réellement supprimer un widget du séparateur - l'API publique QSplitter ne fournit pas de méthode pour le faire. Le mieux que vous puissiez faire est de cacher les enfants. Des idées? – Thomi

0

Vous devez faire deux choses. Définissez les widgets (qui ne doivent pas être redimensionnables) à l'intérieur du séparateur sur FixedSize et modifiez le curseur des poignées du séparateur correspondant en Qt::ArrowCursor. Les poignées commencent à zéro (à gauche et non utilisés), de sorte que la première poignée entre deux widgets est par index 1.

Voici un échantillon (mettre le code dans 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(); 
} 

Maintenant, la la première poignée du diviseur est disabled et la seconde fonctionne.

10

Pour ce faire:

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