Qt c++ 依赖组合框和依赖标签

Posted

技术标签:

【中文标题】Qt c++ 依赖组合框和依赖标签【英文标题】:Qt c++ dependent Comboboxes and dependent label 【发布时间】:2020-05-11 11:58:06 【问题描述】:

我有一个包含 2 列的 data.csv 文件。第一列包含一些国家名称,第二列包含每个国家的首都。在我的用户界面中有一个包含国家名称的组合框,旁边有一个标签。我想要的是从组合框和标签中选择一个国家来显示所选国家的首都。到目前为止我尝试过的是:

QFile datafile("path to data.csv");
if(datafile.open (QIODevice::ReadOnly | QIODevice::Text))
    
        QTextStream line(&datafile);
        while (!line.atEnd())
          QString linetext=line.readLine(); // reads line from file
          const QStringList fields  linetext.split(',') ;
          const QString Country  fields[0] ;
          const QString Capital  fields[1] ;
          ui->combobox->additem(Country);

          //add code here (or outside of while?) to show capital next to combobox

     

当显示大写的代码在里面时,它会打印 thw 表的最后一行。当我把它放在外面时,fields 不会被识别。有没有办法使文件全局可用? 有没有更简单的方法?

2020 年 12 月 5 日编辑

这是问题的第一部分,我使用 thibsc 的答案解决了这个问题。我想进一步推进这个项目。

假设组合框包含 2 个国家,“希腊”和“意大利”,因此首都是“雅典”和“罗马”。我还有 2 个csv 文件,每个文件都包含每个首都的著名景点,文件以城市名称命名。那将是Athens.csvRome.csv

So when a country is selected then the label shows the capital city next to it.我想使用城市名称调用相应的csv 文件,并在第二个组合框中显示旅游景点列表。如图所示,每个文件的第一列包含景点。第二列是可选的。

问题是当我从第一个组合框中选择一个国家时,第二个组合框不会加载文件,这是因为每当我从第一个组合框更改县时,第二个组合框就会从之前的选择中加载旅游景点

完整代码在这里

#include "mapproject.h"
#include "ui_mapproject.h"
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QComboBox>
#include <QList>

MapProject::MapProject(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MapProject)

    ui->setupUi(this);
    QFile datafile("/home/spyros/untitled/data.csv");
    if(datafile.open (QIODevice::ReadOnly | QIODevice::Text))
        
            QTextStream line(&datafile);
            while (!line.atEnd())
              QString linetext=line.readLine(); // reads line from file
              const QStringList fields = linetext.split(',');
              ui->comboBox->addItem(fields.first(), QVariant(fields.last()));
         
    connect(ui->comboBox, &QComboBox::currentTextChanged, [this]()
        ui->label->setText(ui->comboBox->currentData().toString());
    );
    ui->comboBox_2->setEnabled(false);
    ui->comboBox->setCurrentIndex(-1);


MapProject::~MapProject()

    delete ui;



void MapProject::on_comboBox_currentIndexChanged(const QString &arg1)

    ui->comboBox_2->setEnabled(true);
    QString City = ui->label->text();
    QFile cityfile("/home/spyros/untitled/"+City+".csv");
    if(cityfile.open (QIODevice::ReadOnly | QIODevice::Text))
        
            QTextStream line(&cityfile);
            while (!line.atEnd())
              QString linetext=line.readLine(); // reads line from file
              const QStringList fields = linetext.split(',');
              ui->comboBox_2->addItem(fields.first(), QVariant(fields.last()));
         
    

【问题讨论】:

【参考方案1】:

你有2个字段,第一个是国家,第二个是首都,所以我认为最好的方法是使用QComboBox::currentDataQComboBox项中映射两者:

const QStringList fields = linetext.split(',');

// Set the item text (displayed), and the itemData (capital)
ui->combobox->additem(fields.first(), QVariant(fields.last()));

现在您只需连接信号即可更新您的标签(在您的 while 循环之后):

connect(ui->comboBox, &QComboBox::currentTextChanged, [this]()
    ui->label->setText(ui->comboBox->currentData().toString());
);

【讨论】:

您的代码有效。这个问题解决了,但又出现了一个问题。请检查编辑。谢谢。 @mac,填写前别忘了清空你的combobox,你可以调用lambda里面的代码 @mac,lambda 是我的答案的一部分,就像这样:[]() 清除 combobox_2 没有帮助。我创建了第二个标签只是为了显示 City 变量打印的内容。当我第一次选择一个国家时,它不会打印任何东西。当我重新选择一个国家时,它会打印上一个选择的首都。这就是我认为每次加载错误的csv文件的原因。 @mac,您是否已将代码用于填充 lambda 中的第二个组合框?

以上是关于Qt c++ 依赖组合框和依赖标签的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中向工具栏添加按钮/操作以外的控件,例如文本框和组合框?

如何为组合框和列表中的选项添加标签?

组合框依赖于另一个组合框 - JavaFX

Qt C++根据组合框中的选择创建一个对象

使用带有排序组合框和页面组合框上的许多项目的列表视图

Microsoft Access 组合框和 vba 代码 2007