gpt4 book ai didi

c++ - 更新对话框的 MainWindow

转载 作者:行者123 更新时间:2023-11-30 03:48:47 27 4
gpt4 key购买 nike

我有一个带有菜单的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_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);

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

基本上有两种方法可以做到这一点。您可以获取指向现有主窗口的指针(可以将其提供给对话框的构造函数或其自身的方法)或使用 Signals and Slots Qt 的概念,在我看来这是要走的路。

  1. 首先,您在对话框的标题中定义信号:

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

    //MainWindow *mw = new MainWindow(this);
    //mw->list();
    emit this->user_registered();
  3. 确保 list() 方法在 MainWindow header 中声明为 SLOT

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

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

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

关于c++ - 更新对话框的 MainWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32982677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com