2013-05-01 137 views
0

我有一個數據庫驅動的qt應用程序,它顯示客戶列表,當您單擊客戶時,它會打開另一個窗口,允許您編輯客戶詳細信息並將其保存到數據庫。在QT中更新另一個視圖

這工作正常,但即時通訊想知道如何觸發其他窗口中的tableView刷新。

在Objective-C中有一些名爲delegates的東西,我有一種感覺,這是類似的,但有人可以澄清這樣做的正確方法嗎?

謝謝。

病人列表:

#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(); 
    } 
} 

回答

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); 

它可能是更好地使用一些建築在editPatient類和類似了自己的信號,更實現解耦接口類(比如DataModelInterface或類似),並讓UI對象將它們的插槽連接到該插槽。

相關問題