更新MainWindow以进行对话

时间:2015-10-07 02:10:25

标签: c++ qt oop

我有一个finalMessage = finalName + System.getProperty("line.separator") + finalContact + " \r\n"+ finalDept + " \n" + "\n \n \n" + "Dear Doctor Dondi," + "\n\n \t\t" + finalMessageBody; ,其中有一个菜单可以打开一个注册对话框。如何在注册后更新MainWindow中的tableView?

以下是我的MainWindow实施:

MainWindow

这是我的Dialog实现

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

1 个答案:

答案 0 :(得分:2)

代码中的以下行

MainWindow *mw = new MainWindow(this);

创建主窗口并更新其列表。我认为这确实发生了,但窗口从未显示过,所以你看不到任何一个。您真正想要做的是更新现有主窗口的列表。

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

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

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

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

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

    ...
    QObject::connect(this->dialog_test, SIGNAL(user_registered()), this, SLOT(list()));
    ...
    
  5. 使用这种方法,对话框根本不需要知道主窗口。它基本上只是告诉任何有兴趣的用户注册并且主窗口完全依赖于它。