Что не так с этим кодом Qt? - PullRequest
       47

Что не так с этим кодом Qt?

0 голосов
/ 08 декабря 2010

Я читал учебник MVC и хотел опробовать код, но по какой-то причине (которую я не могу понять) он не работает.

Предполагается, что этот код отображает содержимое текущего каталога в QListWidget.

#include <QApplication>
#include <QFileSystemModel>
#include <QModelIndex>
#include <QListWidget>
#include <QListView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFileSystemModel *model = new QFileSystemModel;
    QString dir = QDir::currentPath();
    model->setRootPath(dir);
    QModelIndex parentIndex = model->index(dir);
    int numRows = model->rowCount(parentIndex);
    QListWidget *list = new QListWidget;
    QListWidgetItem *newItem = new QListWidgetItem;

    for(int row = 0; row < numRows; ++row) {
        QModelIndex index = model->index(row, 0, parentIndex);
        QString text = model->data(index, Qt::DisplayRole).toString();
        newItem->setText(text);
        list->insertItem(row, newItem);
    }

    list->show();
    return a.exec();
}

Ответы [ 2 ]

4 голосов
/ 09 декабря 2010

Есть 2 проблемы.

Первый , описанный ответом Фрэнка Остерфельда . Move:

QListWidgetItem *newItem = new QListWidgetItem;

в вашу петлю.

Вторая связана с моделью потоков QFileSystemModel. из документов для QFileSystemModel:

В отличие от QDirModel, QFileSystemModel использует отдельный поток для заполнения себя, поэтому он не приведет к зависанию основного потока при запросе файловой системы. Вызовы rowCount () будут возвращать 0, пока модель не заполнит каталог.

и

Примечание. Для QFileSystemModel требуется экземпляр приложения с графическим интерфейсом.

Я не думаю, что QFileSystemModel() будет работать должным образом до после цикла событий Qt (который запускается a.exec() в вашем примере).

В вашем случае, model->rowCount(parentIndex) возвращает 0, даже если в каталоге есть элементы (по крайней мере, это то, что он делает в моем тесте).

Замена QFileSystemModel на QDirModel (и удаление вызова model->setRootPath(dir), который QDirModel` не поддерживает) заполняет список.

1 голос
/ 08 декабря 2010

Вы должны создать новый элемент для каждой строки.Переместите

QListWidgetItem *newItem = new QListWidgetItem;

в цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...