1.QTableWidget的使用(二)
自定义qtablewidget控件,实现定制化需求,例子:
(1)实现qtablewidget的第一列不能编辑,其他列可以编辑
(2)实现将excel表格中的一行数据复制到qtablewidget中
#ifndef MYTABLEWIDGET_H
#define MYTABLEWIDGET_H
#include <QTableWidget>
#include <QApplication>
#include <QClipboard>
#include <QKeyEvent>
class mytablewidget : public QTableWidget
{
public:
mytablewidget(QWidget *parent = nullptr);
void mousePressEvent(QMouseEvent *event) override {
QTableWidgetItem *item = currentItem();
if (item && currentColumn() == 0) {
// 第一列单元格不可编辑
setEditTriggers(QAbstractItemView::NoEditTriggers);
} else {
// 其他单元格可编辑
setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
}
QTableWidget::mousePressEvent(event);
}
void keyPressEvent(QKeyEvent *event) override {
// 检查是否按下了Ctrl键和V键,并且没有按下其他键
if (event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier) {
// 执行你的自定义操作,比如获取粘贴板数据
handlePasteEvent();
} else {
// 如果不是Ctrl+V组合键,则调用基类的事件处理函数
QWidget::keyPressEvent(event);
}
}
void handlePasteEvent()
{
// 获取粘贴板对象
QClipboard *clipboard = QApplication::clipboard();
// 获取粘贴板中的文本数据
QString text = clipboard->text();
// qDebug() << text; 1\t2\n
text.chop(1);
QStringList list = text.split("\t");
int listLen = list.length();
for(int i = 0; i < (this->columnCount() - currentColumn()) && i < listLen; i++)
{
if(this->item(currentRow(),currentColumn() + i) == nullptr)
{
this->setItem(currentRow(),currentColumn() + i,new QTableWidgetItem(list[i]));
}
else
{
this->item(currentRow(),currentColumn() + i)->setText(list[i]);
}
}
}
};
#endif // MYTABLEWIDGET_H