2017-03-09 141 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代碼是正確的,並向我暗示其他東西是錯的。

相關問題