2017-03-09 50 views
1

有没有人有一个简短的例子(希望在C++)来说明添加QTreeView到QDockWidget?QTreeView可以添加到QDockWidget

我试图使用QLayout作为中间对象,如:

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); 

哪里swatch1是从QDockWidget的类型。我的代码运行,但树没有出现在DockWidget上。

我看到了QTreeWidget的例子,但由于树视图会频繁更改,所以我更喜欢使用QTreeView。

有没有人可以提供关于如何把QTreeView放到QDockWidget上的简短例子?谢谢

+1

它似乎在您的程序离开此代码段的范围后,w和model将被删除,因为它们的生命期到期。为了避免这种情况,你应该这样做: TreeModel * model = new TreeModel(..); QTreeView * w = new QTreeView; –

回答

0

您可以使用QDockWidget::setWidget设置停靠窗口的内容。例如

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); 
} 

或者,你可以使用这样的事情,如果你想在码头布局内的树:

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

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

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

QDockWidget是一个QWidget,所以如果swatch1是你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

周杰伦,我想在这里补充一点。你的第一个建议代码:

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); 
} 

我试过类似的东西。但是,在编译期间,dock-> setWidget(treeView)失败,并有一个错误消息说这是不允许的。我无法理解,因为QTreeView是一个小部件,为什么这是不允许的。或者,例如,我试着通过编译的QTreeWidget项目的dock-> setWidget(treeWidget)。

+0

“dock-> setWidget(treeView)失败,并有错误消息说这不被允许”。什么错误信息?在编译时还是运行时? –

1

问题解决了。这是我的原始代码:

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

该代码位于对象方法的范围内。在堆栈中创建的QTreeView实例将在方法退出后立即销毁,并且它将从Dock小部件中移除。这就是代码运行的原因,我看不到树。

Thibaut B.和Jay,非常感谢你们。您的帖子向我证实,我自己写的代码是正确的,但其他的东西是错的...