【问题标题】:Qt signal and slot doesn't work when QTableView is updated更新 QTableView 时 Qt 信号和槽不起作用
【发布时间】:2016-06-10 05:11:01
【问题描述】:

我有一个QTableView 和一个按钮。我已经使用信号和插槽将表格视图与功能连接起来。插槽执行以下功能。每当用户选择单行时,必须启用该按钮。如果用户没有选择一行或选择了多行,则必须禁用该按钮。这是代码。

connect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &)));

当我刷新表格视图时,问题就开始了。然后信号和插槽停止工作。刷新表格的代码如下。

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

    int qrycount = 0;


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

如何更改代码以便在实现信号和槽机制的同时刷新表格。

【问题讨论】:

  • 根据Qt documentation。 "设置要呈现的视图的模型。此函数将创建并设置一个新的选择模型,替换之前使用 setSelectionModel() 设置的任何模型。但是,旧的选择模型不会被删除,因为它可能在多个模型之间共享意见。如果不再需要旧的选择模型,我们建议您删除它。 -- 由于选择模型被替换,signall/slot 连接停止工作。
  • 调用QSqlQueryModel::setQuery 将重置模型。您不必在每次执行查询时都创建新模型。另外,不要使用new 初始化对象,除非您需要它们在当前范围之外生存。例如,您可以使用 QSqlQuery query("...", db.digidb); 初始化 QSqlQuery

标签: c++ qt qt-signals


【解决方案1】:

在 refresh() 开头添加这个来整理:

disconnect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &)));

然后在 refresh() 结束时使用它来连接你的新模型:

connect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &)));

【讨论】:

  • 为什么不只创建和设置一次模型,而不是每次执行刷新时。这也不能解决内存泄漏问题。
  • @JamesAdkison 问题是关于信号不起作用的——我只发布了一个修复程序。此外,OP“可能”在其他地方有一个整洁的功能来处理内存分配 - 因为我们没有完整的代码,所以无法真正判断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多