2013-05-03 205 views
0

我正在做一個簡單的文件資源管理器,我遇到了Qt的一些問題。我想向用戶展示他的計算機上的文件的樹形視圖,但我也希望能夠選擇多個文件/目錄並稍後使用它們進行操作(通過選擇checkboxes或多個選擇使用ctrl + 左鍵單擊轉變 + 左擊)。我已經放置了QTreeView元素併爲其設置了一個模型(QFileSystemModel)。它給了我一個很好的樹視圖,但我不能修改標題(列名),或者在每行中添加我自己的列(例如)checkbox。 Qt對我來說是新手,我已經爲一些技巧/解決方案尋找了好幾個小時,但沒有任何工作與QFileSystemModel。有什麼我可以做得到這個工作?QT樹,允許多選

的代碼很簡短:下面的

QString lPath = "C:/"; 
QString rPath = "C:/"; 
leftTree_model = new QFileSystemModel(this); 
rightTree_model = new QFileSystemModel(this); 

leftTree_model->setRootPath(lPath); 
rightTree_model->setRootPath(rPath); 

//i have actually 2 tree views that work the same 
ui->leftTree->setModel(leftTree_model); //ui->leftTree is the first tree view 
ui->rightTree->setModel(rightTree_model); //the second 

回答

1

使用的東西:

CheckStateRole到複選框添加到您的模型。爲此,您繼承QFileSystemModel中的自定義項目模型(您將使用該模型),並重新實現data()方法,其中您返回的值爲CheckStateRolebool值。您還需要使用QAbstractItemModel::setData方法來處理更改。您還可以檢查docs for QAbstractItemModel,看看如何改變標題文本(headerData()

更改您的視圖的selection mode,以允許多重選擇

編輯: 這裏是一個示例代碼,從模型繼承

class MyFancyModel : public QFileSystemModel 
    { 
    public: 
    MyFancyModel(QObject* pParent = NULL) : QFileSystemModel(pParent) 
    { 
    } 

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const 
    { 
     if (role == Qt::CheckStateRole) 
     { 
     // stub value is true 
     return true; // here you will return real values 
         // depending on which item is currently checked 
     } 
     return QFileSystemModel::data(index, role); 
    } 
    }; 
+0

你能否擴展你的答案?我得到了選擇模式,已經做到了。我得到了繼承('class treeModel:public QFileSystemModel'),但是我遇到了'treeModel'構造函數的問題(錯誤:無法解析的外部符號...)。我用'leftTree_model = new treeModel(this);'替換'leftTree_model = new QFileSystemModel(this);',但它不起作用。 – sobol6803 2013-05-03 10:10:28

+0

我有另一個問題。複選框是可點擊的,但它們呈現出奇怪的行爲。如果我點擊一個複選框,釋放鼠標按鈕並將光標移動到每個複選框上,它們都會被檢查。在這裏你有代碼:http://ideone.com/Xrrdo9。我做錯了什麼? – sobol6803 2013-05-05 14:08:57

+0

這是因爲你爲每一行返回相同的狀態,而不管被檢查的項是什麼:'return checkstatus;'該視圖應該如何知道,其中的所有對象的哪個複選框需要檢查? – spiritwolfform 2013-05-06 07:11:46