2017-03-09 140 views
0

我想在QDockWidget上显示使用QTreeView的文件系统。树会动态更改,所以我决定使用QTreeView而不是QTreeWidget。QTreeView放在QDockWidget中时不显示

这里是我的代码:

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

如果唯一的区别是你的代码不在主函数内部,你确定它确实被执行了吗?并且树视图是否包含数据 – xander

回答

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

编译和VS2013,Qt的5.6测试了它在Windows 10(64位):

Snapshot of testQDockTreeView

如可在快照中可以看到QTreeView可见(停靠和未停靠)。我检查了两个鼠标点击 - 他们做到了。

(我想这是我的我写过最起码的Qt应用程序之一。)

0

雪夫,

非常感谢您的回答。对不起,我可能不太清楚什么我问:树变得可见,当这个代码段是在main(){....}功能:

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

QTreeView w; 
w.setModel(&model); 
w.show(); 

但相同的代码(几乎相同)不不工作(程序运行,但树不可见),当这部分代码在内部主窗口和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)是可见的,但不是树。仍在挣扎...

0

问题解决了。我自己编写的原始代码是正确的,但它是在一个对象方法中,只要执行离开对象,树就会被销毁。

所以,这是一个C++变量范围问题,并不完全是一个Qt问题。我一直在使用python,只是切换回C++。

谢谢你的帖子,向我确认Qt代码是正确的,并向我暗示其他东西是错的。

相关问题