【问题标题】:QT QTableWidget,How can I select text while the item is uneditableQT QTableWidget,如何在项目不可编辑时选择文本
【发布时间】:2021-03-23 07:42:29
【问题描述】:

嗯,这就是我想要的:我双击项目,然后我可以选择我想要复制的文本,同时项目中的文本应该是不可更改的。 但是,当我使用 setEditTriggers(QAbstractItemView::NoEditTriggers) 时,我无法选择文本。 谁来帮帮我!

【问题讨论】:

标签: qt qtablewidget


【解决方案1】:

您可以使用项目委托来修改编辑器,并将其设置为只读,如下所示:

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

【讨论】:

    【解决方案2】:

    是的,终于解决了……我的代码如下:

    #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());
    

    【讨论】:

    • 其实这些代码我不是很懂,但是可以用。谁在乎...
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多