我想在QDockWidget上使用QTreeView显示文件系统。树将动态更改,因此我决定使用QTreeView而不是QTreeWidget。
这是我的代码:
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();
QTreeView w;
w.setModel(&model);
swatch1->setWidget(&w);
w.setEnabled(true);
addDockWidget(leftarea, swatch1);
swatch1属于QDockWidget类型。上面的代码位于类型(继承自)MainWindow的函数体内。代码运行顺畅,树不会显示。
我还尝试了另一种方法:将QTreeView放入QVBoxLayout(使用setWidget方法),然后将其放入QDockWidget(使用setLayout方法)。第二个代码也运行顺畅,树不会出现。
此代码是从Qt Creator IDE上的工作示例中复制的,我测试了它的工作原理。唯一的区别是,在原始的QTreeView示例中,上面的代码放在main(){.....}函数中。
有没有人有一个工作示例,将QTreeView放入QDockWidget并正常工作(代码实际显示树)?提前谢谢。
答案 0 :(得分:1)
我不太清楚OP中出了什么问题。但是,我做了一个最小的完整样本,看看是否有陷阱:
// standard C++ header:
#include <iostream>
#include <string>
// Qt header:
#include <QApplication>
#include <QDockWidget>
#include <QFileSystemModel>
#include <QMainWindow>
#include <QTreeView>
using namespace std;
int main(int argc, char **argv)
{
cout << QT_VERSION_STR << endl;
// main application
#undef qApp // undef macro qApp out of the way
QApplication qApp(argc, argv);
// setup GUI
QMainWindow qWin;
QDockWidget qDock;
qDock.setAllowedAreas(Qt::AllDockWidgetAreas);
QTreeView qTreeView;
QFileSystemModel qFSModel;
qTreeView.setModel(&qFSModel);
QString path = QDir::currentPath();
QModelIndex indexPath = qFSModel.index(path);
qTreeView.scrollTo(indexPath);
qDock.setWidget(&qTreeView);
qWin.addDockWidget(Qt::TopDockWidgetArea, &qDock);
qWin.show();
// run application
return qApp.exec();
}
在Windows 10(64位)上使用VS2013,Qt 5.6进行编译和测试:
从快照中可以看出,QTreeView
是可见的(停靠和取消停靠)。我检查了两次重复操作鼠标点击 - 他们做了。
(我想这是我写过的最小的Qt应用程序之一。)
答案 1 :(得分:0)
雪夫,
非常感谢您的回答。抱歉,我可能不清楚我在问什么:当这段代码在main(){....}函数中时,树变得可见:
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();
QTreeView w;
w.setModel(&model);
w.show();
但是当这部分代码在MainWindow中的类函数中并且QTreeView被添加到QDockWidget时,相同的代码(几乎相同)不起作用(程序运行但树不可见):
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
TreeModel model(file.readAll());
file.close();
QTreeView w;
w.setModel(&model);
swatch1->setWidget(&w);
addDockWidget(leftarea, swatch1);
这里,leftarea是Qt:DockWidgetArea,而swatch1是从QDockWidget继承的类型的对象。当运行这个程序时,swatch(一个QDockWidget)是可见的,但不是树。还在苦苦挣扎......
答案 2 :(得分:0)
问题解决了。我自己编写的原始代码是正确的,但它是在一个对象方法中,一旦执行离开对象,树就会被破坏。
因此,这是一个C ++变量范围问题,而不是Qt问题。我已经使用python一段时间了,只需切换回C ++。
Scheff,谢谢您的帖子向我确认Qt代码是正确的,并向我建议其他错误。