自定义QTableView右键弹出菜单, 并复制选中的单元格内容到剪贴板中

简介: 自定义QTableView右键弹出菜单, 并复制选中的单元格内容到剪贴板中

源码如下:


头文件

private:
    QAction *m_pActionCopy;
private slots:
    void copyData1();
    void copyData2();


源文件:

void frmDbDelegate::initTableView()
{
m_pActionCopy = new QAction(tr("复制"), ui->tableView);
    connect(m_pActionCopy, &QAction::triggered, this, &frmDbDelegate::copyData2);
    ui->tableView->setSelectionMode(QAbstractItemView::ContiguousSelection); //设置为连续选择模式
    ui->tableView->setContextMenuPolicy(Qt::ActionsContextMenu);             //设置为action菜单模式
    ui->tableView->addAction(this->m_pActionCopy);
}
//粘贴板表格内容格式:
//列与列之间内容以制表符分隔("\t")
//行与行之间内容以换行符分隔("\n")
//粘贴:
//获取粘贴板内容,把内容分解成单个item的值并放到表格中
//通过QApplication::clipboard()->text()类获取粘贴板的内容
//复制:
//获取选中item,把选中item内容组织一下并放到粘贴板
//通过QApplication::clipboard()->setText()设置粘贴板内容
void frmDbDelegate::copyData1()
{
    QModelIndexList indexes = ui->tableView->selectionModel()->selectedIndexes();
    if (indexes.count() == 0)
    {
        //select nothing
        return;
    }
    QMap<QString, QString> map;
    QModelIndex index;
    int k = 0;
    int maxCol = 0;
    int maxRow = 0;
    int minCol = 0;
    int minRow = 0;
    foreach (index, indexes)
    {
        int col = index.column();
        int row = index.row();
        if (k == 0)
        {
            minCol = col;
            minRow = row;
        }
        if (col > maxCol)
            maxCol = col;
        if (row > maxRow)
            maxRow = row;
        QString text = index.model()->data(index, Qt::EditRole).toString();
        map[QString::number(row) + "," + QString::number(col)] = text;
        k++;
    }
    QString rs = "";
    for (int row = minRow; row <= maxRow; row++)
    {
        for (int col = minCol; col <= maxCol; col++)
        {
            if (col != minCol)
                rs += "\t";
            rs += map[QString::number(row) + "," + QString::number(col)];
        }
    }
    rs += "\r\n";
    //复制到剪贴板
    QClipboard *board = QApplication::clipboard();
    board->setText(rs);
    qDebug() << rs;
}
void frmDbDelegate::copyData2()
{
    QStringList list;
    QModelIndexList indexes = ui->tableView->selectionModel()->selectedIndexes();
    if (indexes.count() == 0)
    {
        //select nothing
        return;
    }
    foreach (const QModelIndex &index, indexes)
    {
        list << index.data().toString();
    }
    QApplication::clipboard()->setText(list.join(","));
}




---


参考文献


《Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中》


http://www.doczj.com/doc/c51cfb63cf84b9d528ea7a29.html


《已选中QTableView中的行/行复制到QClipboard》


http://cn.voidcc.com/question/p-myqnyjft-mk.html


《复制QTableView的一部分(Copying part of QTableView)》


https://www.it1352.com/549965.html


《QTableWidget, QTableView实现粘贴复制》


https://blog.csdn.net/time_forget/article/details/100765595


相关文章
|
机器学习/深度学习 存储 人工智能
基于内容的图像检索系统设计与实现(1)
基于内容的图像检索系统设计与实现(1)
基于内容的图像检索系统设计与实现(1)
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
3295 0
【密码学】一文读懂MurMurHash2
|
编解码 JavaScript 开发工具
鸿蒙应用开发从入门到实战(二):DevEco Studio工具安装
大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,欢迎关注!
965 1
|
关系型数据库 MySQL Linux
Qt连接Mysql出现问题(一):“Driver not loaded Driver not loaded“
第一眼看见这张图我也觉得很奇怪,显示有QMYSQL但是又说没有,这不自相矛盾吗!
3819 4
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
1118 19
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
算法 数据库
基于MATLAB的心电信号去噪
基于MATLAB的心电信号去噪
575 0
|
监控 安全 Linux
在Linux中,如何进行网络资源的优先级管理?
在Linux中,如何进行网络资源的优先级管理?
|
Java 应用服务中间件 API
springboot+nginx获取真实IP
springboot+nginx获取真实IP
967 4
|
开发工具 Android开发 iOS开发
搭建Flutter开发环境、从零基础到精通
搭建Flutter开发环境、从零基础到精通

热门文章

最新文章