Дерево QT, допускающее множественный выбор

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

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

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

person sobol6803    schedule 03.05.2013    source источник


Ответы (1)


Используйте что-нибудь из следующего:

CheckStateRole, чтобы добавить флажки в модель. Для этого вы наследуете свою пользовательскую модель элемента (которую собираетесь использовать) от QFileSystemModel и повторно реализуете метод data(), возвращая bool значений для CheckStateRole. Вам также понадобится метод QAbstractItemModel::setData для обработки изменений. Вы также можете проверить документы для QAbstractItemModel, чтобы узнать, как изменить тексты заголовков (headerData())

Измените режим выбора вашего представления, чтобы разрешить множественный выбор

РЕДАКТИРОВАТЬ: вот пример кода для наследования от модели

  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);
    }
  };
person spiritwolfform    schedule 03.05.2013
comment
не могли бы вы немного расширить свой ответ? Я получаю режим выбора, сделал это уже. Я получаю наследство (class treeModel : public QFileSystemModel), но у меня проблема с конструктором treeModel (ошибка: неразрешенный внешний символ...). Я заменяю leftTree_model = new QFileSystemModel(this); на leftTree_model = new treeModel(this);, но это не работает. - person sobol6803; 03.05.2013
comment
У меня другая проблема. Флажки кликабельны, но ведут себя странно. Если я щелкну один флажок, отпущу кнопку мыши и наведу курсор на каждый флажок, все они будут отмечены. Вот код: ideone.com/Xrrdo9. Что я делаю неправильно? - person sobol6803; 05.05.2013
comment
это потому, что вы возвращаете один и тот же статус для каждой строки, независимо от того, какой элемент был проверен: return checkstatus; Как представление должно знать, какой флажок из всех них должен быть проверен? - person spiritwolfform; 06.05.2013
comment
Итак, я должен хранить каждый индекс и статус флажка, соответствующего ему? - person sobol6803; 06.05.2013
comment
или вы можете сохранить элементы, которые выбраны. И это то, что вы хотите в первую очередь - person spiritwolfform; 06.05.2013
comment
Хорошо, я справился с этим с помощью QHash, но когда я нажимаю на флажки, они переключаются только тогда, когда я перемещаю курсор в другое место. Они не обновляются сразу. В чем может быть проблема? - person sobol6803; 06.05.2013
comment
вам необходимо правильно реализовать setData (dataChanged( ) сигнал) - person spiritwolfform; 06.05.2013