2013-05-03 1 views
0

Я делаю простой проводник файлов, и я столкнулся с некоторыми проблемами с Qt. Я хочу показать пользователю древовидное представление файлов на своем компьютере, но я также хочу иметь возможность выбирать несколько файлов/каталогов и делать что-то с ними позже (путем выбора checkboxes или множественного выбора с использованием ctrl + левый клик или смещение + левый клик). Я поместил элемент QTreeView и установил для него модель (QFileSystemModel). Это дает мне хорошее древовидное представление, но я не могу изменить заголовки (имена столбцов) или добавить собственный столбец с checkbox в каждой строке (например). Qt является новым для меня, я искал несколько хороших часов для некоторых советов/решений, но ничего не работает с QFileSystemModel. Есть ли что-нибудь, что я могу сделать, чтобы заставить это работать?Дерево QT, которое позволяет multiselection

Код короток и прост:

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(), где вы возвращаете bool значения для CheckStateRole. Вам также понадобится метод QAbstractItemModel::setData для обработки изменений. Вы также можете проверить docs for QAbstractItemModel, чтобы увидеть, как изменить текст заголовка (headerData())

Изменение selection mode вашей точки зрения, чтобы несколько выбора

EDIT: вот пример кода, чтобы наследовать от модели

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 = новый QFileSystemModel (this);' с 'leftTree_model = new treeModel (this);', но он не работает. – sobol6803

+0

У меня есть еще одна проблема. Эти флажки можно щелкнуть, но они представляют странное поведение. Если я нажму на один флажок, отпустите кнопку мыши и переместите курсор над каждым флажком, все они будут проверены. Здесь у вас есть код: http://ideone.com/Xrrdo9. Что я делаю неправильно? – sobol6803

+0

Это потому, что вы возвращаете одинаковый статус для каждой строки, независимо от элемента, который был проверен: 'return checkstatus;' Как должно отображаться представление, какой флажок для всех из них необходимо проверить? – spiritwolfform

 Смежные вопросы

  • Нет связанных вопросов^_^