我想在 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 并工作(代码实际上显示了树)?提前致谢。
最佳答案
我不太确定 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 应用程序之一。)
关于c++ - QTreeView 放置在 QDockWidget 中时不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42697731/