您可以通过实现 QTableWidget
的 mouseMoveEvent()
方法来实现鼠标悬停时一行高亮的效果。具体步骤如下:
- 在构造函数中设置表格的
setMouseTracking(true)
,以便能够接收到鼠标移动事件。
QTableWidget *table = new QTableWidget();
table->setMouseTracking(true);
- 重载
mouseMoveEvent(QMouseEvent *event)
方法,在该方法中获取当前鼠标所在行的索引,并将该行设置为高亮状态。
void MyTableWidget::mouseMoveEvent(QMouseEvent *event)
{
int row = table->rowAt(event->pos().y());
if (row != currentRow) {
table->item(currentRow, 0)->setBackground(Qt::white); // 取消上一行高亮
currentRow = row;
table->item(currentRow, 0)->setBackground(Qt::yellow); // 高亮当前行
}
}
完整代码示例:
#include <QApplication>
#include <QWidget>
#include <QTableWidget>
#include <QHeaderView>
class MyTableWidget : public QTableWidget {
public:
MyTableWidget(QWidget *parent = nullptr) : QTableWidget(parent), currentRow(-1) {
setRowCount(10);
setColumnCount(3);
horizontalHeader()->setVisible(false);
for (int i = 0; i < rowCount(); ++i) {
QTableWidgetItem *item0 = new QTableWidgetItem(QString("Item %1").arg(i));
QTableWidgetItem *item1 = new QTableWidgetItem(QString("Description %1").arg(i));
QTableWidgetItem *item2 = new QTableWidgetItem(QString("Value %1").arg(i));
setItem(i, 0, item0);
setItem(i, 1, item1);
setItem(i, 2, item2);
}
setMouseTracking(true);
}
protected:
void mouseMoveEvent(QMouseEvent *event) override
{
int row = rowAt(event->pos().y());
if (row != currentRow) {
item(currentRow, 0)->setBackground(Qt::white); // 取消上一行高亮
currentRow = row;
item(currentRow, 0)->setBackground(Qt::yellow); // 高亮当前行
}
}
private:
int currentRow;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyTableWidget table;
table.show();
return a.exec();
}
运行程序后,将鼠标悬停在某一行上,该行会高亮显示。