gpt4 book ai didi

c++ - 确保 QTableView 中列的唯一值

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:10 25 4
gpt4 key购买 nike

我已经实现了自定义 QTableViewQAbstractTableModelQTableView 使用 Qt-default 文本行编辑委托(delegate)来处理字符串数据。我想确保在提交编辑后(按 enter),该字符串在其列中是唯一的。如果另一行对该列具有相同的值,则编辑将被拒绝,可能会出现一个弹出框,然后文本行编辑将以编程方式放回编辑模式,以便用户可以重试。

我考虑过使用自定义委托(delegate)并可能通过信号和插槽在委托(delegate)和 TableView 之间进行通信。委托(delegate)可以确保值在 setModelData() 中是唯一的。为此,必须向其注入(inject)有关其他列的知识。如果该值不是唯一的,委托(delegate)可以发出一个信号, TableView 将接收;类似于 notUniqueTryAgain()。在那个插槽内,表格会弹出一条消息,然后在单元格上调用 edit()。这是正确的方法吗?

最佳答案

使用下一个委托(delegate):

#ifndef ITEMDELEGATE_H
#define ITEMDELEGATE_H

#include <QItemDelegate>

class ItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit ItemDelegate(QObject *parent = 0);

protected:
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget * editor, const QModelIndex & index) const;
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;
void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const;

signals:

public slots:

};

#endif // ITEMDELEGATE_H

Cpp

#include "itemdelegate.h"
#include <QLineEdit>
#include <QDebug>

ItemDelegate::ItemDelegate(QObject *parent) :
QItemDelegate(parent)
{
}

QWidget *ItemDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QLineEdit *editor = new QLineEdit(parent);
return editor;
}


void ItemDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value =index.model()->data(index, Qt::EditRole).toString();
QLineEdit *line = static_cast<QLineEdit*>(editor);
line->setText(value);
}


void ItemDelegate::setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *line = static_cast<QLineEdit*>(editor);
QString data = line->text();

int column = index.column();

for(int i = 0; i < model->rowCount(); i++)
{
QModelIndex cur = model->index(i,column);
qDebug() << data << model->data(cur, Qt::EditRole).toString();
if(data == model->data(cur, Qt::EditRole).toString())
{
model->setData(index, "wrong");
return;
}
}

model->setData(index, data);
}


void ItemDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}

用法:

ItemDelegate *itDelegate = new  ItemDelegate;
ui->tableView->setItemDelegate(itDelegate);

这是一个很好的例子,所以你可以做所有其他的事情,例如:

if(data == model->data(cur, Qt::EditRole).toString())
{
//model->setData(index, "wrong");
QMessageBox msgBox;
msgBox.setText("Try again.");
msgBox.exec();
return;
}

等等。

当然,如果 View 中有很多项目,它可能会很慢,所以您可以使用 QProgressDialog 来向用户显示您需要多少次:

QProgressDialog progress("Checking...", "Searching", 0, model->rowCount(), 0);
for(int i = 0; i < model->rowCount(); i++)
{
progress.setValue(i);
QModelIndex cur = model->index(i,column);
qDebug() << data << model->data(cur, Qt::EditRole).toString();
if(data == model->data(cur, Qt::EditRole).toString())
{
model->setData(index, "wrong");
return;
}
if (progress.wasCanceled())
return;
}
progress.close();

关于c++ - 确保 QTableView 中列的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724732/

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