2016-05-29 6 views
0

У меня есть QTableView вместе с кнопкой обновления и некоторыми другими кнопками, как показано ниже:QTableView не обновляется, когда функция обновления вызывается из другого класса

enter image description here

У меня есть функция, которая обновить таблицу. Когда кнопка обновления нажата, вызывается функция. Код для функции приведен ниже.

void client_table_view::refreshTable() 
{ 



    dbconnector db; 
    QSqlQueryModel* modal = new QSqlQueryModel(); 
    QSqlQuery* qry = new QSqlQuery(db.digi_db) ; 


    qry->exec("select client_id,company_name,contact_name,address,email,phone from client_details"); 

    modal->setQuery(*qry); 
    ui->client_table->setModel(modal); 




    for (int c = 0; c < ui->client_table->horizontalHeader()->count(); ++c) 
    { 
     ui->client_table->horizontalHeader()->setSectionResizeMode(
      c, QHeaderView::Stretch); 
    } 
    ui->client_table->setSelectionBehavior(QAbstractItemView::SelectRows);//select the whole row instead of individual cell 
    ui->client_table->setShowGrid(true); 
    ui->client_table->setColumnHidden(0,true); 
    qDebug()<<"Table Refreshed"; 
} 

При нажатии на кнопку редактирования щелкнул диалоговое окно появляется, как указано ниже, который может быть использован для редактирования любой строки в таблице.

enter image description here

Когда кнопка сохранения нажата я называю ту же кнопку обновления в конце, чтобы обновить таблицу, но она не обновляет таблицу. Функция вызывается, но таблица не обновляется. Код, который вызывается при нажатии кнопки сохранения, приведен ниже.

void client_details::on_pushButton_2_clicked() 
{ 


    dbconnector db; 
    QString company_name,contact_name,country,address,city,state,email,phone,website,tin; 
    company_name = ui->company_name->text(); 
    contact_name = ui->contact_name->text(); 
    country = ui->countrycombobox->currentText(); 
    address = ui->address->toPlainText(); 
    city = ui->city->text(); 
    state = ui->state->text(); 
    email = ui->email->text(); 
    phone = ui->phone->text(); 
    website = ui->website->text(); 
    tin = ui->tin->text(); 
    if(window_title=="Edit Info"){ 

    //qDebug()<<window_title; 
     db.updateClient(company_name,country,contact_name,address,city,state,email,phone,website,tin,current_client_id); 

    } 
    else if(window_title=="Add Client"){ 

    db.insertIntoClient(company_name,country,contact_name,address,city,state,email,phone,website,tin); 
    } 



    QMessageBox::information(
     this, 
     tr("Saved"), 
     tr("Information has been saved.")); 


    client_table_view ctv; 
    ctv.refreshTable(); //call refresh function to refresh table view 





    this->close(); 




} 
+0

Вы вставив отредактированные значения обратно в базу данных? –

+0

@lbarros да. при нажатии кнопки сохранения значения сохраняются в базе данных. Сразу после этого я вызываю функцию refresh table. Он работает, но таблица не обновляется. –

+0

Если вы снова обновляете таблицу, отображаются ли новые значения правильно? –

ответ

0

Как было предложено в комментариях, ваше мнение таблица не обновляется при вставке новой записи, потому что вы обновляете новый экземпляр класса табличного, а не тот, который отображается:

void client_details::on_pushButton_2_clicked() 
{ 
    ... 
    client_table_view ctv; // <-- new instance here 
    ctv.refreshTable(); // <-- refresh the new instance, not the one displayed! 
    this->close(); 
} 

в Qt, канонический способ уведомить об изменениях заключается в использовании сигналов и слотов:

  1. определить новый сигнал в классе client_details для обозначения входа часа как было добавлено;
  2. при добавлении нового клиента испускает сигнал;
  3. подключите этот сигнал к разъему refreshTable() в вашем client_table_view.

class client_details : public QWidget // or another widget type 
{ 
signals: 
    void entry_added();    // <-- the new signal 
slots: 
    void on_pushButton_2_clicked(); // <-- see implementation below 
    ... 
    // the rest is as before 
}; 

void client_details::on_pushButton_2_clicked() 
{ 
    ... 

    // instead of this: 
    //  client_table_view ctv; 
    //  ctv.refreshTable(); 
    // just emit a signal: 
    emit entry_added(); 

    this->close(); 
} 

class client_table_view : public QTableView 
{ 
slots: 
    void refreshTable(); // as before 
    ... 
    // the rest is as before 
}; 

// put things together, use signals/slots: 
client_details * cd = new client_details(...); 
client_table_view * ctv = new client_table_view(...); 
connect(cd,        // emitter 
    &client_details::entry_added,  // signal 
    ctv,        // receiver 
    &client_table_view::refreshTable); // slot 

 Смежные вопросы

  • Нет связанных вопросов^_^