【发布时间】:2021-03-23 07:42:29
【问题描述】:
嗯,这就是我想要的:我双击项目,然后我可以选择我想要复制的文本,同时项目中的文本应该是不可更改的。 但是,当我使用 setEditTriggers(QAbstractItemView::NoEditTriggers) 时,我无法选择文本。 谁来帮帮我!
【问题讨论】:
-
请发布您的问题的minimal reproducible example
标签: qt qtablewidget
嗯,这就是我想要的:我双击项目,然后我可以选择我想要复制的文本,同时项目中的文本应该是不可更改的。 但是,当我使用 setEditTriggers(QAbstractItemView::NoEditTriggers) 时,我无法选择文本。 谁来帮帮我!
【问题讨论】:
标签: qt qtablewidget
您可以使用项目委托来修改编辑器,并将其设置为只读,如下所示:
class ReadonlyDelegate : public QItemDelegate {
public:
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
QWidget *w = QItemDelegate::createEditor(parent, option, index);
qobject_cast<QLineEdit*>(w)->setReadOnly(true);
return w;
}
};
// [in setup of view]
myTable->setItemDelegate(new ReadonlyDelegate(myTable));
【讨论】:
是的,终于解决了……我的代码如下:
#include <QLineEdit>
#include <QStyledItemDelegate>
class ReadOnlyDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
ReadOnlyDelegate(QObject* parent = 0) :QStyledItemDelegate()
{
}
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,
const QModelIndex& index) const override
{
QLineEdit* editor = new QLineEdit(parent);
editor->setFrame(false);
editor->setReadOnly(true);
return editor;
}
void setEditorData(QWidget* editor, const QModelIndex& index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QLineEdit* spinBox = static_cast<QLineEdit*>(editor);
spinBox->setText(value);
}
void setModelData(QWidget* editor, QAbstractItemModel* model,
const QModelIndex& index) const
{
QLineEdit* spinBox = static_cast<QLineEdit*>(editor);
QString value = spinBox->text();
model->setData(index, value, Qt::EditRole);
}
void updateEditorGeometry(QWidget* editor,
const QStyleOptionViewItem& option, const QModelIndex& index) const
{
editor->setGeometry(option.rect);
}
};
在用户界面中:
ui.TableWidget->setItemDelegate(new ReadOnlyDelegate());
【讨论】: