可以将QTreeView添加到QDockWidget中

时间:2017-03-09 10:43:52

标签: c++ qt user-interface qtreeview qdockwidget

有没有人有一个简短的例子(希望用C ++)来说明将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上的简短示例?感谢

4 个答案:

答案 0 :(得分: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是一个小部件,为什么不允许这样做。或者,例如,我尝试使用dock-> setWidget(treeWidget)来传递编译的QTreeWidget项。

答案 1 :(得分:1)

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

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

代码属于对象方法的范围。一旦方法退出,就会销毁在堆栈上创建的QTreeView实例,并且它将从停靠窗口小部件中删除。这就是代码运行的原因,我看不到树。

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

答案 2 :(得分: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);
}

或者,如果您希望将树放在Dock中的布局中,您可以使用类似的东西:

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

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

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

答案 3 :(得分: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);