2017-03-09 4 views
1

Est-ce que quelqu'un a un petit exemple (espérons en C++) pour illustrer l'ajout d'un QTreeView à un QDockWidget?QTreeView peut-il être ajouté à QDockWidget?

I essayé d'utiliser QLayout comme un objet intermédiaire, en tant que:

QFile file(":/default.txt"); 
file.open(QIODevice::ReadOnly); 
TreeModel model(file.readAll()); 
file.close(); 

QTreeView w; 
w.setModel(&model); 
w.setWindowTitle(QObject::tr("Simple Tree Model")); 

QGridLayout  *layout; 
layout = new QGridLayout; 
layout->addWidget(&w, 0, 0, 1, 3); 
swatch1->setLayout(layout); 

Lorsque swatch1 est d'un type de QDockWidget. mon code s'exécute, mais l'arborescence n'apparaît pas sur le DockWidget.

J'ai vu des exemples de QTreeWidget, mais puisque l'arborescence sera changée fréquemment, je préfère utiliser un QTreeView.

Quelqu'un peut-il fournir un court exemple sur la façon de mettre QTreeView sur QDockWidget? Merci

+1

il semblerait qu'après que votre programme laisse la portée de cet extrait de code, w et le modèle serait supprimé, comme leur durée de vie expire . Pour éviter cela, vous devriez faire: TreeModel * model = new TreeModel (..); QTreeView * w = new QTreeView; –

Répondre

0

Vous pouvez utiliser QDockWidget::setWidget pour définir le contenu de la fenêtre Dock. Par exemple

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    QDockWidget* dock = new QDockWidget; 
    setCentralWidget(dock); 

    QTreeView* treeView = new QTreeView; 
    dock->setWidget(treeView); 

    QFileSystemModel* treeModel = new QFileSystemModel; 
    treeModel->setRootPath(QDir::currentPath()); 
    treeView->setModel(treeModel); 
} 

Sinon, vous pouvez utiliser quelque chose comme ça si vous voulez avoir l'arbre dans une mise en page dans la station d'accueil:

QWidget* container = new QWidget; 
dock->setWidget(container); 

QLayout* layout = new QHBoxLayout; 
container->setLayout(layout); 

QTreeView* treeView = new QTreeView; 
layout->addWidget(treeView) 
0

QDockWidget est un QWidget, donc si swatch1 est votre DockWidget:

QMainWindow mw; 
QTreeView *w = new QTreeView(&mw); 
QDockWidget *swatch1 = new QDockWidget("Simple Tree Model", &mw); 
swatch1->setWidget(w); 
// addDockWidget is a method of QMainWindow 
mw.addDockWidget(Qt::RightDockWidgetArea, swatch1); 
1

Jay, je veux ajouter un peu ici. Votre premier code suggéré:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    QDockWidget* dock = new QDockWidget; 
    setCentralWidget(dock); 

    QTreeView* treeView = new QTreeView; 
    dock->setWidget(treeView); 

    QFileSystemModel* treeModel = new QFileSystemModel; 
    treeModel->setRootPath(QDir::currentPath()); 
    treeView->setModel(treeModel); 
} 

J'ai essayé quelque chose de similaire. Mais, lors de la compilation, dock-> setWidget (treeView) a échoué et a un message d'erreur disant que ceci n'est pas autorisé. Je ne pouvais pas comprendre puisque QTreeView est un widget, pourquoi cela n'est pas autorisé. Alternativement, par exemple, j'ai essayé dock-> setWidget (treeWidget) pour un élément QTreeWidget passé compilation.

+0

"dock-> setWidget (treeView) a échoué et a un message d'erreur indiquant que cela n'est pas autorisé". Quel message d'erreur? Au moment de la compilation ou de l'exécution? –

1

Le problème a été résolu. Ceci est mon code original:

Qt Code: Switch view 
QTreeView w; 
w.setModel(&model); 
swatch1->setWidget(&w); 
w.setEnabled(true); 

Le code est dans le cadre d'une méthode d'objet. L'instance QTreeView créée sur la pile sera détruite dès que la méthode sera terminée, et elle sera supprimée du widget Dock. C'est pourquoi le code s'exécute, et je ne peux pas voir l'arbre. Thibaut B. et Jay, merci beaucoup à tous les deux. Vos messages me confirme que le code que j'ai écrit est correct, mais quelque chose d'autre est faux ...