无法从文本文件中填充列

时间:2015-05-09 10:45:20

标签: qt

这里我使用了一个lineEdit从用户那里获取输入逗号分隔值。单击PushButton会将其写入文件( data.txt )。当我们点击ReadTable pushButton时,它应填写文件的第二列表格。我正在尝试读取以逗号分隔并尝试填充第二列的文本文件,但当前无法执行。第一列是固定列,不能从文件填充。 这是我迄今为止尝试过的代码。

void MainWindow::writefile()
{
    QString str = ui->lineEdit->text();
    QString filename = "data.txt";
    QFile file(filename);
    file.open(QIODevice::WriteOnly|QIODevice::Text);
    QTextStream out(&file);
    out<<str<<endl;
    file.close();
}
void MainWindow::on_pushButton_3_clicked()
{
    readfilefortable();
}

void MainWindow::readfilefortable()
{
    QFile file("data.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    while (!file.atEnd())
    {
        QString line = file.readLine();
        parseline(line);
    }
}
void MainWindow::parseline(QString line)
{
        QList< QStringList > list;
        list << line.split(",");

        ui->tableWidget->setRowCount(list.size());
        ui->tableWidget->setColumnCount(2);
        ui->tableWidget->setHorizontalHeaderLabels(QString("Field;Value").split(";"));


        ui->tableWidget->setSortingEnabled( false );

        QString string[5] = { "Sequence" , "Seconds" , "Cost" , "Offer" , "Promotion" };
        for( int i = 4 ; i >= 0 ; --i )
        {
           ui->tableWidget->insertRow( 0 );

           ui->tableWidget->setItem( 0 , 0 , new QTableWidgetItem( string[i] ) );
        }

        ui->tableWidget->setSortingEnabled( true );
}

enter image description here

1 个答案:

答案 0 :(得分:1)

有些事情需要考虑。即使您编写文件,也应检查file.open():

QFile file( filename );
if ( file.open( QIODevice::WriteOnly | QIODevice::Text ) )
{
    QTextStream out( &file );
    out << str << endl;
    file.close();
}

我认为使用QFile类的write(...)函数也会更容易。但这不是问题的一部分。

我认为您的代码存在两个主要问题。你写了这个:

    QList< QStringList > list;
    list << line.split( "," );

但你只需要这个:

    QStringList list = line.split( "," );

您只需要一个字符串列表,而不是字符串列表的列表。

第二个问题是您从未尝试用任何数据填充第二列。你刚刚填写了第一列。使用此代码填充第一列也会更容易:

    QStringList firstColumn = QStringList() << "Sequence" << "Seconds" << "Cost" << "Offer" << "Promotion";
    for ( int i = 0; i < firstColumn.size(); ++i )
    {
       ui->tableWidget->setItem( i, 0, new QTableWidgetItem( firstColumn[ i ] ) );
    }

以同样的方式填写第二列。

您也可以像这样填写水平标题。您不需要创建字符串并将其拆分。

ui->tableWidget->setHorizontalHeaderLabels( QStringList() << "Field" << "Value" );

更新: 您可以使用此文件更新第二列中的数据。

for ( int i = 0; i < listFromFile.size(); ++i )
{
   ui->tableWidget->setItem( i, 1, new QTableWidgetItem( listFromFile[ i ] ) );
}

1用于表格小部件中的第二列。 listFromFile是代码中的变量列表。