【问题标题】:QTreeWidget changes row height automaticallyQTreeWidget 自动改变行高
【发布时间】:2011-12-06 22:15:21
【问题描述】:

将文件加载到我的 QTreeWidget 后,行数比 bevor 高。

如何避免这种行为?

这是我的申请:

底部的 QTreeWidget 与上面的设置相同。

这里是一个csv文件的加载函数:

void MainWindow::openCSV()
{
    if(!arffRead)
    {
        QMessageBox msgBox;
        msgBox.setIcon(QMessageBox::Warning);
        msgBox.setText("You have to open the .arff file at first.");
        msgBox.exec();        
        return;
    }
    QFileDialog dialog(this);
    dialog.setFileMode(QFileDialog::ExistingFile);
    dialog.setNameFilter(tr("CSV (*.csv)"));
    dialog.setViewMode(QFileDialog::Detail);
    QString fileName;
    QString buffer;
    if (dialog.exec() == QFileDialog::Accepted)
    {
        fileName = dialog.selectedFiles()[0];

        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            cout << "Error opening " + fileName.toStdString() + "." << endl;
        }

        gameTable->clear();

        QVector<QStringList> csvFile;

        while (!file.atEnd())
        {
            QString line(file.readLine());
            QStringList tokens = line.split(",");
            csvFile.push_back(tokens);
        }

        if(distanceTable->topLevelItemCount() != csvFile.size())
        {
            QMessageBox msgBox;
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.setText("Your files have different numbers of lines.");
            msgBox.exec();        
            return;
        }

        for(int i=0; i<distanceTable->topLevelItemCount();i++)
        {
            for(int j=0; j<csvFile.size(); j++)
            {
                if(distanceTable->topLevelItem(i)->text(1) == csvFile.at(j).at(0))
                {
                    QTreeWidgetItem* item = new QTreeWidgetItem;
                    item->setText(0, QString::number(i+1));
                    item->setText(1, csvFile.at(j).at(0));
                    item->setText(2, csvFile.at(j).at(2));

                    QString strategy = csvFile.at(j).at(3);
                    for(int k=4;k<csvFile.at(j).size();k++)
                    {
                        strategy += " " % csvFile.at(j).at(k);
                    }
                    item->setText(3, strategy);

                    gameTable->insertTopLevelItem(i,item);
                    break;
                }
            }
        }
        gameTable->resizeColumnToContents(3);
    }
}

这里作为一个例子,我的 csv 文件中缩短了一行:

1,Zerg,lose,Train Drone,3,Train Overlord,37,Train Drone,44,Build Spawning,80, (...)

我将 csv 文件中第三个字段的所有数据连接起来。

我希望所有数据的顺序相同,所以我从 distanceTable 中获取 GameId,然后插入 csv 文件中的数据。

提前致谢!

托比亚斯

【问题讨论】:

  • 代码在这里会很有帮助。屏幕截图没有给我们任何潜在问题的迹象。
  • 好的,我添加了插入部分。 “i”是“#”列的计数器。 csvFile 是一个 QVector。 “j”是 csv 文件的行计数器。
  • 我使用 QT Designer 来创建 GUI...如果这些信息对我有帮助的话。 :-)
  • cvsFile.push_back() 上设置断点,看看它是否将 "\r\n" 或空字符串推入你的向量..
  • 这看起来是一个有趣的项目。为了在 Windows 上扩展 johnathon 的理论,从 Excel 保存的 .csv 将在每行之后有\r\n,这可能会导致这种情况。如果是这种情况,您可以从tokens 中的最后一个字符串中去除这些字符。

标签: c++ resize row qtreewidget


【解决方案1】:

感谢 johnathon 和 AJG85!

一个简单的 trimmed() 就可以了。我不知道为什么我没有自己考虑。

QString strategy = csvFile.at(j).at(3);
for(int k=4;k<csvFile.at(j).size();k++)
{
   strategy += " " % csvFile.at(j).at(k);
}
strategy = strategy.trimmed();
item->setText(3, strategy);

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 2018-01-21
    • 2019-09-29
    • 2019-07-04
    • 2010-09-27
    • 2013-07-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多