比如有一个 QTableWidget*m_tbwQuery
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
/// 事件过滤
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);
}
最后是实现复制到剪贴板的函数
// 复制选定单元格内容到剪贴板的函数
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);
}
}