定义一个名为Person的结构体,包括以下几个成员: QStringname,intsex,intage,QStringdescription 要求:用户输入的年龄范围在(20-30) (4)单击“Add”按钮,完成如下事情:1.检查姓名、描述是否为空,如果是空的,弹 出一个对话框,提示哪项不能为空;2.如果检查通过了,则根据用户输入生成一个 Person数据,保存到一个链表std::list<Person>中。(10分) (5)单击“Show”按钮,完成如下事情:1.弹出一个对话框,对话框与上图相同,只是 按钮名分别为“Pre”和“Next”;2.刚弹出时,对话框中显示存储在链表中的第一 条记录;3.按下“Pre”和“Next”按钮,对话框分别显示当前记录的前一条和后一 条记录信息。(15分)
时间: 2024-02-20 07:56:13 浏览: 105
好的,我明白了你的问题。以下是 C++ 实现的代码:
首先,定义 Person 结构体:
```cpp
struct Person {
QString name;
int sex;
int age;
QString description;
};
```
然后,定义保存 Person 数据的链表:
```cpp
std::list<Person> persons;
```
接下来,实现 “Add” 按钮的槽函数:
```cpp
void on_addButton_clicked() {
// 获取用户输入的姓名、性别、年龄和描述
QString name = ui->nameLineEdit->text().trimmed();
int sex = ui->sexComboBox->currentIndex();
int age = ui->ageSpinBox->value();
QString description = ui->descriptionTextEdit->toPlainText().trimmed();
// 检查姓名和描述是否为空
if (name.isEmpty() || description.isEmpty()) {
QMessageBox::warning(this, tr("Warning"), tr("Name or description can not be empty!"));
return;
}
// 检查年龄是否在范围内
if (age < 20 || age > 30) {
QMessageBox::warning(this, tr("Warning"), tr("Age should be between 20 and 30!"));
return;
}
// 生成 Person 数据并添加到链表中
Person person;
person.name = name;
person.sex = sex;
person.age = age;
person.description = description;
persons.push_back(person);
// 清空输入框
ui->nameLineEdit->clear();
ui->sexComboBox->setCurrentIndex(0);
ui->ageSpinBox->setValue(20);
ui->descriptionTextEdit->clear();
}
```
最后,实现 “Show” 按钮的槽函数:
```cpp
void on_showButton_clicked() {
// 弹出对话框
QDialog dialog(this);
Ui::ShowDialog ui;
ui.setupUi(&dialog);
// 如果链表为空,则提示无数据
if (persons.empty()) {
ui.preButton->setEnabled(false);
ui.nextButton->setEnabled(false);
ui.nameLabel->setText(tr("No data!"));
ui.sexLabel->clear();
ui.ageLabel->clear();
ui.descriptionLabel->clear();
} else {
// 显示第一条记录
auto it = persons.begin();
showPerson(ui, *it);
// 如果只有一条记录,则禁用 "Pre" 和 "Next" 按钮
if (persons.size() == 1) {
ui.preButton->setEnabled(false);
ui.nextButton->setEnabled(false);
} else {
// 否则,禁用 "Pre" 按钮(因为第一条记录没有前一条记录)
ui.preButton->setEnabled(false);
}
}
// 连接 "Pre" 和 "Next" 按钮的槽函数
connect(ui.preButton, &QPushButton::clicked, [&ui, it = persons.begin()]() mutable {
// 显示前一条记录
showPerson(ui, *--it);
// 如果已经到达第一条记录,则禁用 "Pre" 按钮
if (it == persons.begin()) {
ui.preButton->setEnabled(false);
}
// 否则,启用 "Next" 按钮
ui.nextButton->setEnabled(true);
});
connect(ui.nextButton, &QPushButton::clicked, [&ui, it = persons.begin()]() mutable {
// 显示后一条记录
showPerson(ui, *++it);
// 如果已经到达最后一条记录,则禁用 "Next" 按钮
if (it == std::prev(persons.end())) {
ui.nextButton->setEnabled(false);
}
// 否则,启用 "Pre" 按钮
ui.preButton->setEnabled(true);
});
// 显示对话框
dialog.exec();
}
```
其中,`showPerson` 函数用于显示一个 Person 数据:
```cpp
void showPerson(Ui::ShowDialog& ui, const Person& person) {
ui.nameLabel->setText(person.name);
ui.sexLabel->setText(person.sex == 0 ? tr("Male") : tr("Female"));
ui.ageLabel->setText(QString::number(person.age));
ui.descriptionLabel->setText(person.description);
}
```
注意:以上代码中的 `Ui::ShowDialog` 类是 Qt Designer 自动创建的对话框类,用于存储对话框的 UI 布局和控件。
阅读全文