修改qt QTableView里的modal数据并更新数据

1.当表格有某行被选择时,获取所选行的QModelIndex并调用setData函数
int row = ui.tv_searchList->currentIndex().row();
//QAbstractItemModel *model = ui.tv_searchList->model();
//m_deviceTableModel是qtableview关联的modal类
QModelIndex index_Name = m_deviceTableModel->index(row, 6);//选中行第7列的内容
QModelIndex index_Pwd = m_deviceTableModel->index(row, 7);//选中行第8列的内容
m_deviceTableModel->setData(index_Name, QVariant::fromValue(name));
m_deviceTableModel->setData(index_Pwd, QVariant::fromValue(password));
2.修改Modal 里的SetData函数(本人只是想修改第7列和第8列的数据)
     代码里的自定义modal类DeviceTableModel是继承了 public QAbstractItemModel的
 重载函数声明:
bool DeviceTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
函数体里关键代码如下:
if (role == Qt::EditRole )//setData参数不指定的话 role 默认就为Qt::EditRole
{
if (index.column() == 6)
{
m_devList->at(index.row()).personalUserName = value.toString().toStdString();
}
if (index.column() == 7)
{
m_devList->at(index.row()).personalPassword = value.toString().toStdString();
}
}
emit this->dataChanged(index, index);
以下是一个简单的示例代码,展示了如何使用多线程分别处理数据获取和任务处理,并在主线程中动态创建 TableView。 ```cpp #include <QtWidgets> #include <QtConcurrent> class Worker : public QObject { Q_OBJECT public: Worker(QObject *parent = nullptr) : QObject(parent) {} public slots: void fetchData() { // 模拟获取大量数据 QList<QString> data; for (int i = 1; i <= 100000; i++) { data << QString("Item %1").arg(i); } // 将数据传回主线程 emit dataReady(data); } signals: void dataReady(const QList<QString> &data); }; class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr) : QWidget(parent) { // 界面初始化 QVBoxLayout *layout = new QVBoxLayout(this); QPushButton *btn = new QPushButton("Fetch Data"); tableView = new QTableView(this); layout->addWidget(btn); layout->addWidget(tableView); // 点击按钮开始获取数据 connect(btn, &QPushButton::clicked, this, &Widget::startFetchingData); // 等待数据的信号 connect(&worker, &Worker::dataReady, this, &Widget::handleDataReady); // TableView 的模型 model = new QStandardItemModel(this); model->setColumnCount(1); } private: QTableView *tableView; QStandardItemModel *model; QFutureWatcher<void> watcher; Worker worker; private slots: void startFetchingData() { // 启动线程获取数据 QFuture<void> future = QtConcurrent::run(&worker, &Worker::fetchData); watcher.setFuture(future); // 显示等待对话框 QProgressDialog progress("Fetching Data...", "Cancel", 0, 0, this); progress.setWindowModality(Qt::WindowModal); progress.setMinimumDuration(0); // 等待线程完成或取消 while (!watcher.isFinished()) { QApplication::processEvents(); if (progress.wasCanceled()) { watcher.cancel(); break; } } } void handleDataReady(const QList<QString> &data) { // 清空模型 model->removeRows(0, model->rowCount()); // 将数据添加到模型 for (const QString &item : data) { QList<QStandardItem*> row; row << new QStandardItem(item); model->appendRow(row); } // 设置模型到 TableView 上 tableView->setModel(model); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); Widget widget; widget.show(); return app.exec(); } #include "main.moc" ``` 在这个示例中,我们创建了一个 `Worker` 类来处理数据获取的工作。这个类中定义了一个 `fetchData` 的槽函数,用于模拟获取大量数据。我们使用 `QtConcurrent::run` 函数在新线程中执行这个槽函数,然后使用 `QFutureWatcher` 来监视这个线程的状态。 在主界面中,我们创建了一个 TableView 和一个按钮,点击按钮会触发获取数据的操作。我们在按钮的槽函数中启动获取数据的线程,并在主线程中显示等待对话框,等待线程完成或取消。当线程完成时,我们将获取到的数据通过信号传回主线程,并在主线程中更新 TableView 的模型。 需要注意的是,在这个示例中我们使用了一个简单的等待对话框来等待线程的完成。这种做法可能会导致界面卡住,不利于用户体验。更好的做法是使用信号和槽机制,将等待对话框和线程完全分离开来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值