放置在QDockWidget内时QTreeView没有显示

时间:2017-03-09 14:19:56

标签: c++ qtreeview qdockwidget

我想在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并正常工作(代码实际显示树)?提前谢谢。

3 个答案:

答案 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进行编译和测试:

Snapshot of testQDockTreeView

从快照中可以看出,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代码是正确的,并向我建议其他错误。