更新对话框的主窗口

Update MainWindow for dialog

本文关键字:窗口 对话框 更新      更新时间:2023-10-16

我有一个带有菜单的MainWindow,该菜单打开一个注册对话框。注册后如何更新MainWindow中的tableView ?

这是我的MainWindow实现:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){
    ui->setupUi(this);
}

void MainWindow::list()
{
    qDebug() << "test";
    QSqlQueryModel *model = new QSqlQueryModel();
    //model->clear();
    model->setQuery("SELECT test_qt FROM db_qt WHERE strftime('%Y-%m-%d', date)='"+dateTime.toString("yyyy-MM-dd")+"'");
    model->setHeaderData(0, Qt::Horizontal, tr("qt_test"));
    ui->tableView->setModel(model);
}
void MainWindow::on_actionMenu_triggered()
{
    dialog_test->show();
}

这是我的Dialog实现

Dialog_test::Dialog_test(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog_test)
{
    ui->setupUi(this);
}
void Dialog_test::insert_date(){
    QSqlQuery qry;
    qry.prepare("INSERT INTO db_qt(test_qt) VALUES (?)");
    qry.addBindValue(id);
    if (qry.lastInsertId()>0){
        QMessageBox::information(this,"test", "Success");
        MainWindow *mw = new MainWindow(this);
        mw->list(); // I call back list, but not update the tableView the MainWindow.
    }
}

代码中的以下行

MainWindow *mw = new MainWindow(this);

创建一个新的主窗口并更新它的列表。我假设这确实发生了,但窗口从未显示,因此您看不到任何内容。你真正想做的是更新现有的主窗口的列表。

基本上有两种方法。你既可以获得一个指向现有主窗口的指针(它可以提供给对话框的构造函数或它自己的方法),也可以使用Qt的信号和槽的概念,这是我的观点。

  1. 首先,在对话框的头部定义信号:

    ...
    signals:
        void user_registered();
    ...
    
  2. 然后在函数中发出信号

    //MainWindow *mw = new MainWindow(this);
    //mw->list();
    emit this->user_registered();
    
  3. 确保list()方法在主窗口头文件中被声明为SLOT

  4. 在MainWindow构造函数中连接信号以调用list()插槽:

    ...
    QObject::connect(this->dialog_test, SIGNAL(user_registered()), this, SLOT(list()));
    ...
    

使用这种方法,对话框根本不需要知道主窗口。它基本上只是告诉任何对用户注册感兴趣的人,并且主窗口完全自己对它起作用。