【问题标题】:What is wrong with this Qt code?这个 Qt 代码有什么问题?
【发布时间】:2010-12-08 20:18:47
【问题描述】:

我正在阅读 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();
}

【问题讨论】:

  • “它不工作”不是很能描述问题。如果您需要帮助,请让人们知道您需要什么帮助。它编译吗?它有什么作用?你怎么知道“它不起作用”?你试过什么?帮助我们帮助
  • 我可能会告诉你问题出在哪里,但你可能会被冒犯。
  • 如果您没有什么有用的补充,请不要增加页面的长度。我同意,我应该更具描述性。

标签: c++ model-view-controller qt


【解决方案1】:

有两个问题。

第一个described by Frank Osterfeld's answer。移动:

QListWidgetItem *newItem = new QListWidgetItem;

进入你的循环。

第二个与QFileSystemModel 的线程模型有关。来自QFileSystemModel 的文档:

与 QDirModel 不同,QFileSystemModel 使用单独的线程来填充自身,因此在查询文件系统时不会导致主线程挂起。在模型填充目录之前,对 rowCount() 的调用将返回 0。

注意:QFileSystemModel 需要一个 GUI 应用程序的实例。

我认为QFileSystemModel() 在Qt 事件循环运行之前(在您的示例中由a.exec() 启动)之后 才能正常工作。

在您的情况下,model-&gt;rowCount(parentIndex) 返回 0,即使目录中有项目(至少这是它在我的测试中所做的)。

QFileSystemModel 替换为QDirModel(并删除QDirModel` 不支持的model-&gt;setRootPath(dir) 调用)填充列表。

【讨论】:

  • 完美,现在当我在上面的代码中使用 QListView 和 QFileSystemModel 时,一切正常。不,是因为一旦模型自我更新,QListView 就会自我更新吗?
  • 此时我自己是一个 Qt 新手(而且我通常不是一个真正的 GUI 程序员)。关于 Qt 模型/视图架构的详细信息,我无能为力,但您关于 QListView/QFileSystemModel 的结论似乎是合理的。
【解决方案2】:

您必须为每一行创建一个新项目。移动

QListWidgetItem *newItem = new QListWidgetItem;

进入for循环。

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2014-08-29
    • 2013-06-05
    • 2014-06-04
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多