比如有一個 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);}
}