从 Qt 中的文本文件填充表格小部件

Posted

技术标签:

【中文标题】从 Qt 中的文本文件填充表格小部件【英文标题】:Populating Table Widget from Text File in Qt 【发布时间】:2012-05-15 20:58:04 【问题描述】:

我是 Qt 新手,需要以下方面的帮助:

我想创建一个包含表格小部件的 GUI,该小部件由制表符分隔的文本文件中的信息填充。在我的 GUI 中,用户将首先浏览文本文件,然后在 Table Widget 中显示内容。我已经完成了浏览部分,但是如何将文本文件中的数据加载到 Table Widget 中?

【问题讨论】:

这个问题很模糊,您使用的是 MVC 还是“传统”小部件?表格小部件是 2D 的,那么表格中的文本将如何布局? 在 Qt Creator 中,我正在使用一个名为 Table Widget 的 GUI 控件。我认为这个问题很简单。我想在我的 GUI 中使用制表符分隔的文本文件作为数据源填充一个表。如果使用表格小部件不是最好的方法,那么我愿意接受其他建议。正如我所提到的,我是 Qt 的新手。 如果您只想在 2D 网格中显示文本,而不与任何其他小部件共享数据,那么 QTableWidget 是最佳选择。此外,如果您在帖子中只问了一个问题,您将得到更好的回应:加载文本文件,将其解析为单独的字符串,然后将它们推送到表格小部件中;是三个非常不同的过程,如果本网站或文档中没有对它们中的每一个进行解释,我会感到惊讶。 【参考方案1】:

分两步,解析文件,然后push到widget中。

我从QFile documentation 中获取了这些行。

 QFile file("in.txt");
 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
     return;

 while (!file.atEnd()) 
     QByteArray line = file.readLine();
     process_line(line);
 

您的 process_line 函数应如下所示:

static int row = 0;
QStringList ss = line.split('\t');

if(ui->tableWidget->rowCount() < row + 1)
    ui->tableWidget->setRowCount(row + 1);
if(ui->tableWidget->columnCount() < ss.size())
    ui->tableWidget->setColumnCount( ss.size() );

for( int column = 0; column < ss.size(); column++)

    QTableWidgetItem *newItem = new QTableWidgetItem( ss.at(column) );
    ui->tableWidget->setItem(row, column, newItem);


row++;

有关操作 QTableWidgets 的更多信息,请查看documentation。对于使用 Qt Creator 中的 GUI 构建器的新用户,一开始很难弄清楚。

最终我会建议切换到他们在所有 examples... 中所做的方式构建 GUI,方法是在代码中手动添加所有内容,而不是拖放。

【讨论】:

【参考方案2】:

对不起...

void squidlogreader_::process_line(QString line)

    static int row = 0;
    QStringList ss = line.split('\t');

    if(ui->tableWidget->rowCount() < row + 1)
    ui->tableWidget->setRowCount(row + 1);
    if(ui->tableWidget->columnCount() < ss.size())
    ui->tableWidget->setColumnCount( ss.size() );

    for( int column = 0; column < ss.size(); column++)
    
    QTableWidgetItem *newItem = new QTableWidgetItem( ss.at(column) );
    ui->tableWidget->setItem(row, column, newItem);
    

    row++;


void squidlogreader_::on_pushButton_clicked()

    QFile file("in.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;

    while (!file.atEnd()) 
        QString line = file.readLine();
        process_line(line);
    

【讨论】:

以上是关于从 Qt 中的文本文件填充表格小部件的主要内容,如果未能解决你的问题,请参考以下文章

pyqt:如何使用相同的函数来设置不同 qt 小部件的文本?

展开文本小部件以填充 Tkinter 中的整个父框架

如何制作 Qt 交互式文本编辑小部件

如何通过 tkinter Scale 小部件的“set”方法使用文本文件中的值?

从 QPlainTextEdit 子类化的 Qt 小部件中的代码折叠?

带有刻度文本标签的 Qt 滑块小部件