qt5-入门-自定义委托-可编辑的TableModel与信号接收

这篇具有很好参考价值的文章主要介绍了qt5-入门-自定义委托-可编辑的TableModel与信号接收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:
C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt5.12

上一篇:
qt5-入门-自定义委托-简单例子_qt 委托-CSDN博客
https://blog.csdn.net/pxy7896/article/details/137234839


本篇重点在于接收信号。Model做了一点点改动。

效果

每个item都是可以编辑的字符串。
qt5-入门-自定义委托-可编辑的TableModel与信号接收,qt,qt,开发语言,windows
编辑之后,输出编辑的位置以及改动后的值(前两个数字是row index和column index,第三个是更改后的值)。
qt5-入门-自定义委托-可编辑的TableModel与信号接收,qt,qt,开发语言,windows

实现

自定义model

class CustomTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit CustomTableModel(QObject* parent = nullptr)
        : QAbstractTableModel(parent)
    {
        // 初始化数据
        //m_data << 1 << 2 << 3 << 4 << 5;
    }

    void setData(QStringList other) {
        this->m_data = other;
    }

    QStringList getData() {
        return  this->m_data;
    }

    QVariant headerData(int section, Qt::Orientation orientation, int role) const override
    {
        if (role == Qt::DisplayRole)
        {
        	// 这个相当于将行名和列名设置为“”,实际仍然占据空间
        	// 如果要完全隐藏需要用setVisible(false),参见最后1节
            return QVariant();
            /*
            if (orientation == Qt::Horizontal)
            {
                return QVariant(); // 返回空的QVariant,不显示列名
            }
            else
            {
                return QVariant(); // 返回空的QVariant,不显示行名
            }*/
        }
        return QAbstractTableModel::headerData(section, orientation, role);
    }

    int rowCount(const QModelIndex& parent = QModelIndex()) const override
    {
        return m_data.size();
    }

    int columnCount(const QModelIndex& parent = QModelIndex()) const override
    {
        return 1;
    }

    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override
    {
        if (!index.isValid())
            return QVariant();

        if (role == Qt::DisplayRole) {
            return m_data.at(index.row());
        }

        return QVariant();
    }

    Qt::ItemFlags flags(const QModelIndex& index) const override
    {
        if (!index.isValid())
            return Qt::NoItemFlags;

        return Qt::ItemIsEditable | QAbstractTableModel::flags(index);
    }

    bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override
    {
        if (index.isValid() && role == Qt::EditRole) {
            m_data.replace(index.row(), value.toString());
            // 这里发出信号了
            emit dataChanged(index, index);
            return true;
        }

        return false;
    }

private:
    QStringList m_data;
};

自定义delegate

class EditableListItemDelegate : public QStyledItemDelegate
{
public:
    EditableListItemDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        return QStyledItemDelegate::sizeHint(option, index);
    }

    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        QStyledItemDelegate::paint(painter, option, index);
    }

    // 创建编辑器
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        QLineEdit *editor = new QLineEdit(parent);
        return editor;
    }

    // 设置编辑器内容
    void setEditorData(QWidget *editor, const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = static_cast<QLineEdit*>(editor);
        lineEdit->setText(index.model()->data(index).toString());
    }

    // 获取并设置更新后的文本到Model
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
    {
        QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
        model->setData(index, lineEdit->text(), Qt::EditRole);
    }

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

使用

注意:这里的隐藏是指完全隐藏,并非只隐藏内容。

QTableView* tableView = new QTableView;
// 隐藏列名列
tableView->horizontalHeader()->setVisible(false);
// 隐藏行号列 
tableView->verticalHeader()->setVisible(false); 

// 设置代理
EditableListItemDelegate* delegate = new EditableListItemDelegate;
tableView->setItemDelegate(delegate);

// 设置数据
CustomTableModel* model = new CustomTableModel;
model->setData({"1", "2"});
tableView->setModel(model);

// 信号接收
QObject::connect(model, &CustomTableModel::dataChanged, [](const QModelIndex &topLeft, const QModelIndex &bottomRight) {
    qDebug() << "Data changed in model:" << topLeft.row() << topLeft.column() << "-" << bottomRight.data().toString() << endl;
});

tableView->show();

done.文章来源地址https://www.toymoban.com/news/detail-857682.html

到了这里,关于qt5-入门-自定义委托-可编辑的TableModel与信号接收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT 自定义信号

    自定义信号,需要 1.在singnals:区域下写信号函数,以及函数对应的参数 2. 需要emit进行发射信号 3. 在需要处理该信号的其他类中,建立信号和其信号槽函数connect() 4. 在其他类中创建信号处理槽函数

    2024年02月09日
    浏览(32)
  • QT学习笔记4--自定义信号的槽

    逻辑:下课后,老师饿了,学生请吃饭。 使用connect函数连接自定义的信号和槽函数。 声明   void classover();  

    2024年02月11日
    浏览(52)
  • 二、Qt定时器与文本编辑器制作《QT 入门到实战》

    了解 qt 的 pixmap 了解 qt 的 label 如何显示图片 了解定时器的开启 了解定时器的关闭 了解文件如何进行读取 了解 QFileDialog 的使用 了解了一个文本编辑器的基本编写 巩固了 connect 的使用 在 Qt 中使用 Label 可以显示文本,但 Label 不止可以显示文本,还可以用于图片的显示。 首

    2024年02月02日
    浏览(46)
  • Qt6入门教程 8:信号和槽机制(连接方式)

    目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 在调用a.setValue(12)时会发送valueChanged(12)信号,此时槽函数b.setValue(12)会

    2024年01月17日
    浏览(58)
  • 界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 (Q技术交流:166830288) 树项

    2024年02月06日
    浏览(60)
  • QT(7)-初识委托

    委托是Qt中的一种机制,用于在Qt模型/视图架构中处理特定类型的数据。委托提供了一种方便的方法来定制特定类型的数据的显示和编辑。 委托可以做以下事情: 编辑特定类型的数据: 通过创建编辑器来编辑特定类型的数据,例如日期,数值等. 渲染特定类型的数据: 通过定制单元

    2024年01月25日
    浏览(31)
  • Qt5.14和Qt5.15在线下载

    https://download.qt.io/archive/qt/5.14/5.14.2/ https://download.qt.io/official_releases/online_installers/ qt 安装太慢的问题如何解决? Qt学习 QT最新版本下载安装(QT5.15及QT6.X) 清华大学 Qt镜像下载中心

    2024年02月12日
    浏览(45)
  • 【Qt5.12】Qt5.12安装教程[通俗易懂]

    Qt5.12下载网址: Index of /archive/qt/5.12/5.12.2 选择Windows平台, Linux和Mac平台类似 下载好之后的安装包: Step1: 双击安装包, 稍等片刻, 然后点击next Step2: 如果没有账号, 则选择skip Step3: Qt设置欢迎界面, 选择下一步 Step4: 选择安装路径 Step5: 选择组件, 然后选择下一步 Step6: 同意许可协议

    2024年02月13日
    浏览(46)
  • C#-sort()利用委托自定义排序

    坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 使用委托自定义Sort()方法,实现排序 例子:演示的是对链表的排序 (力扣算法中等题:147、对链表进行插入排序的非标准解法) 委托自定义排序 以val的值为标准,对

    2024年01月24日
    浏览(38)
  • QT5教程-搭建自己的人机交互界面(附代码)(一):QT5安装与环境配置

    本教程目的在于记录自己开发QT项目的学习过程。 适合刚刚接触QT的初学者 。鉴于个人水平有限,必定错误频出,请各位前辈多多指教。 使用QT5.9.9作为开发工具,开发环境为Ubuntu20.04,图形传输需要安装Opencv4.5.5和FFmpeg。消息传输需要配置mqtt模块。 教程要求学习者对C++有基

    2024年02月11日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包