Qt C++ 依赖组合框和依赖标签
Qt c++ dependent Comboboxes and dependent label
我有一个包含 2 列的 data.csv
文件。第一列包含一些国家名称,第二列包含每个国家的首都。在我的用户界面中有一个包含国家名称的组合框,旁边有一个标签。我想要的是从组合框和标签中选择一个国家,以显示 selected 国家的首都。到目前为止我尝试过的是:
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 table 的最后一行。当我将它放在外面时,fields
无法识别。有没有办法使文件全局可用?
有没有更简单的方法?
编辑 2020 年 12 月 5 日
这是问题的第一部分,我使用 thibsc 的回答解决了这个问题。我想进一步推进该项目。
假设组合框包含 2 个国家,"Greece" 和 "Italy",因此首都城市是 "Athens" 和 "Rome"。我还有 2 个 csv
文件,每个文件包含每个首都的著名景点,文件以城市名称命名。那将是 Athens.csv
和 Rome.csv
.
因此,当一个国家被 select 编辑时,标签会在其旁边显示首都。我想使用城市名称调用相应的 csv
文件并在第二个组合框中显示旅游景点列表。如图所示,每个文件的第一列包含景点。第二列是可选的。
问题是,当我从第一个组合框中select一个国家时,第二个组合框不加载文件,这是因为任何时候我从第一个组合框更改县,然后第二个组合框加载之前 selection
的旅游景点
完整代码在这里
#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()));
}
}
}
您有 2 个字段,第一个是国家,第二个是首都,所以我认为最好的方法是使用 QComboBox::currentData
在 QComboBox
项中映射这两个字段:
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());
});
我有一个包含 2 列的 data.csv
文件。第一列包含一些国家名称,第二列包含每个国家的首都。在我的用户界面中有一个包含国家名称的组合框,旁边有一个标签。我想要的是从组合框和标签中选择一个国家,以显示 selected 国家的首都。到目前为止我尝试过的是:
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 table 的最后一行。当我将它放在外面时,fields
无法识别。有没有办法使文件全局可用?
有没有更简单的方法?
编辑 2020 年 12 月 5 日
这是问题的第一部分,我使用 thibsc 的回答解决了这个问题。我想进一步推进该项目。
假设组合框包含 2 个国家,"Greece" 和 "Italy",因此首都城市是 "Athens" 和 "Rome"。我还有 2 个 csv
文件,每个文件包含每个首都的著名景点,文件以城市名称命名。那将是 Athens.csv
和 Rome.csv
.
因此,当一个国家被 select 编辑时,标签会在其旁边显示首都。我想使用城市名称调用相应的 csv
文件并在第二个组合框中显示旅游景点列表。如图所示,每个文件的第一列包含景点。第二列是可选的。
问题是,当我从第一个组合框中select一个国家时,第二个组合框不加载文件,这是因为任何时候我从第一个组合框更改县,然后第二个组合框加载之前 selection
的旅游景点完整代码在这里
#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()));
}
}
}
您有 2 个字段,第一个是国家,第二个是首都,所以我认为最好的方法是使用 QComboBox::currentData
在 QComboBox
项中映射这两个字段:
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());
});