我有一个数据库驱动的qt应用程序,它显示了客户列表,当您点击客户时,它会打开另一个窗口,允许您编辑客户详细信息并将其保存到数据库中。
这很好但我想知道如何在另一个窗口中触发tableView的刷新。
在Objective-C中有一些叫做委托的东西,我觉得这是相似的,但有人可以澄清这样做的正确方法吗?
感谢。
患者名单:
#include "patientlist.h"
#include "ui_patientlist.h"
#include "database.h"
#include <QtSql>
#include <QtDebug>
PatientList::PatientList(QWidget *parent) :
QWidget(parent),
ui(new Ui::PatientList)
{
ui->setupUi(this);
QSqlQuery qry;
if(qry.exec("SELECT patient_id,firstname,lastname FROM patients")){
qDebug() << "Success";
while(qry.next()){
QTreeWidgetItem *itm = new QTreeWidgetItem(ui->treeWidget);
QString label = QString(qry.value(0).toString());
itm->setText(0,label);
label = QString(qry.value(1).toString());
itm->setText(1,label);
label = QString(qry.value(2).toString());
itm->setText(2,label);
ui->treeWidget->addTopLevelItem(itm);
}
}
else
{
qDebug() << "Error";
}
connect(
ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),
this, SLOT(OnMouseDoubleClicked(QTreeWidgetItem*, int))
);
}
PatientList::~PatientList()
{
delete ui;
}
void PatientList::OnMouseDoubleClicked(QTreeWidgetItem *item, int id)
{
int patient_id = item->text(0).toInt();
editPatient = new EditPatient();
editPatient->loadPatient(patient_id);
editPatient->show();
}
编辑病人:
#include "editpatient.h"
#include "ui_editpatient.h"
EditPatient::EditPatient(QWidget *parent) :
QWidget(parent),
ui(new Ui::EditPatient)
{
ui->setupUi(this);
}
EditPatient::~EditPatient()
{
delete ui;
}
void EditPatient::loadPatient(int patient_id)
{
clearForm();
patient = new Patient();
patient->Load(patient_id);
if(patient->getPatientId() > 0){
qDebug() << "Patient ID: " << patient->getPatientId();
ui->patientidInput->setText(QString::number(patient->getPatientId()));
ui->firstnameInput->setText(patient->getFirstname());
ui->lastnameInput->setText(patient->getLastName());
}
}
void EditPatient::clearForm()
{
ui->patientidInput->setText("");
ui->firstnameInput->setText("");
ui->lastnameInput->setText("");
}
void EditPatient::on_saveButton_clicked()
{
patient->setFirstname(ui->firstnameInput->text());
patient->setLastname(ui->lastnameInput->text());
if(patient){
patient->Save();
}
}
答案 0 :(得分:2)
Signals and slots可能就是你要找的东西。
向EditPatient类标题添加一个信号(应该是QObject派生的),如下所示:
signals:
void patientChanged(int patientId);
在PatientList小部件标题中,添加:
public slots:
void handlePatientChanged(int patientId);
实施 handlePatientChanged(),并将它们连接到:
connect(_editPatientPointer, SIGNAL(patientChanged(int)),
ui->patientListPointer, SLOT(handlePatientChanged(int)));
在需要时触发EditPatient中的信号,使用:
emit patientChanged(patientId);
使用某些架构可能会更好,其中editPat类和类似的信号将它们的信号转发到更多实现解耦的接口类(比如 DataModelInterface 或类似的)并让UI对象连接它们的插槽那个。