【Qt】QTableWidget设置可以选择多行多列,并能复制选择的内容到剪贴板

比如有一个 QTableWidget*m_tbwQuery

c++ 复制代码
m_tbwQuery->installEventFilter(this); //进行事件过滤处理

//设置可以选择多行多列
m_tbwQuery->setSelectionMode(QAbstractItemView::MultiSelection); 
m_tbwQuery->setSelectionBehavior(QAbstractItemView::SelectItems); 
m_tbwQuery->setFocusPolicy(Qt::StrongFocus);  // 或者 Qt::ClickFocus 或 Qt::TabFocus

//点击后,取消原来选择的
connect(m_tbwQuery, &QTableWidget::itemPressed, [=](QTableWidgetItem* item){
    if (item) {
        m_tbwQuery->clearSelection();
        m_tbwQuery->setSelectionMode(QAbstractItemView::MultiSelection);
        m_tbwQuery->setCurrentItem(item);
        item->setSelected(true);
    }
    });
    
// 双击选择一行
connect(m_tbwQuery, &QTableWidget::itemDoubleClicked, [=](QTableWidgetItem* item) {
    if (item) {
        m_tbwQuery->clearSelection();
        m_tbwQuery->setSelectionMode(QAbstractItemView::MultiSelection);
        m_tbwQuery->selectRow(item->row());
    }
    });

在事件过滤中处理键盘事件,快捷键是Ctrl+C

c++ 复制代码
/// 事件过滤
bool QueryDataTable::eventFilter(QObject* obj, QEvent* event) 
{
    if (obj == m_tbwQuery)
    {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
            if (keyEvent->matches(QKeySequence::Copy)) {
                copySelectedCellsToClipboard();
                return true;  // Event handled
            }
        }
    }
    return QObject::eventFilter(obj, event);
}

最后是实现复制到剪贴板的函数

c++ 复制代码
// 复制选定单元格内容到剪贴板的函数
void QueryDataTable::copySelectedCellsToClipboard() 
{
    QItemSelectionModel* selectionModel = m_tbwQuery->selectionModel();
    QModelIndexList indexes = selectionModel->selectedIndexes();

    if (!indexes.isEmpty()) {
        qSort(indexes); // 为了确保数据按照视觉顺序排序
        QString text;
        QModelIndex previous = indexes.first();
        QModelIndex current;

        foreach(const QModelIndex & index, indexes) {
            if (index != previous) {
                if (index.row() != previous.row()) {
                    text += '\n';
                }
                else {
                    text += '\t';
                }
            }

            text += index.data(Qt::DisplayRole).toString();
            previous = index;
        }

        QApplication::clipboard()->setText(text);
    }
}
相关推荐
KENYCHEN奉孝2 分钟前
Rust征服字节跳动:高并发服务器实战
服务器·开发语言·rust
挺菜的10 分钟前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
妮妮喔妮1 小时前
【无标题】
开发语言·前端·javascript
fie88891 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
喝可乐的布偶猫1 小时前
Java类变量(静态变量)
java·开发语言·jvm
喝可乐的布偶猫2 小时前
韩顺平之第九章综合练习-----------房屋出租管理系统
java·开发语言·ide·eclipse
江山如画,佳人北望2 小时前
C#程序入门
开发语言·windows·c#
牵牛老人2 小时前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
coding随想3 小时前
JavaScript中的BOM:Window对象全解析
开发语言·javascript·ecmascript
念九_ysl4 小时前
Java 使用 OpenHTMLToPDF + Batik 将含 SVG 遮罩的 HTML 转为 PDF 的完整实践
java·开发语言·pdf