如何在 QSqlQueryModel 中获取硬编码 QCheckBoxes 的状态?

Posted

技术标签:

【中文标题】如何在 QSqlQueryModel 中获取硬编码 QCheckBoxes 的状态?【英文标题】:How to get the status of hardcoded QCheckBoxes in QSqlQueryModel? 【发布时间】:2015-12-20 22:55:26 【问题描述】:

我有一个QTableView 显示QSqlQueryModel。该模型包含在第一列的每一行中创建的复选框(其中包含 ref_no;我的数据库中的主键),如下所示:

void MainWindow::showM(model)
    ui->tableView->setModel(model);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    for( int i = 0; p<model->rowCount(); i++)
    
        QCheckBox *checkBox = new QCheckBox();
        ui->tableView->setIndexWidget(model->index(i,0),checkBox);
    
    ui->tableView->show();

...它工作正常,显示了我需要的所有信息以及复选框。

现在,我需要获取选中相邻复选框的 ref_no。

怎么做?

【问题讨论】:

【参考方案1】:

使用QSignalMapper(或涉及使用sender() 或lambdas 的映射器的临时解决方案)。例如为映射定义一个成员:

QHash<QCheckBox *, int> m_mapping;

然后在你的代码中像这样连接它:

QCheckBox *checkBox = new QCheckBox();
ui->tableView->setIndexWidget(model->index(i,0),checkBox);
m_mapping[checkBox] = i;
connect(checkBox, &QCheckBox::toggled, this, &MainWindow::onCheckBoxToggled);

然后像这样定义一个槽:

// for the love of kittens use proper names for methods
void MyWindow::onCheckBoxToggled(bool toggled) 
    QCheckBox *box = static_cast<QCheckBox *>(sender());
    const int id = m_mapping.value(box);
    // do something

或者,如果您喜欢 lambda,您可以通过捕获来完成上述操作:

connect(checkBox, &QCheckBox::toggled, 
        [i](bool toggled) /* use i, toggled */ );

话虽如此,我强烈建议不要创建 QCheckBoxes 并使用 setIndexWidget 相反,请使用 proxy model通过返回 Qt::ItemIsUserCheckable 标志和处理 Qt::CheckStateRole 的读取和写入来丰富您的列。

【讨论】:

以上是关于如何在 QSqlQueryModel 中获取硬编码 QCheckBoxes 的状态?的主要内容,如果未能解决你的问题,请参考以下文章

如何在每个月的列中获取最大星期六日期,而无需硬编码

如何在android中存储硬编码的加密主密钥?

如何在没有硬编码文件名的情况下以 Angular 4 下载文件?

RStudio 和 SVN:如何提示连接细节以及如何避免硬编码?

如何在没有互联网连接、没有 eth0 且没有使用 C 的任何硬编码常量的情况下获取我的外部 IP(主接口)[关闭]

如何读取具有动态名称的文件,同时避免在 R 中进行硬编码?