目录
1 需求
子窗口中有QTableView的控件,想要让QTableView获取鼠标点击事件,进行相应的处理
2 问题
继承QDialog的类中重写鼠标事件,
mousePressEvent()函数中打印无相应
3 解决
设置事件过滤器
ui->tableView->viewport()->installEventFilter(this);
事件过滤函数
bool ManageDialog::eventFilter(QObject *obj, QEvent *e)
{
if (obj == ui->tableView->viewport())
{
if (e->type() == QEvent::MouseButtonPress){
QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent *>(e);
if(mouseEvent != nullptr)
emit myQMouseEvent(mouseEvent);
else
qDebug()<<"QEvent to QMouseEvent dynamic_cast fail";
}
}
return QWidget::eventFilter(obj,e);
}
4 其他功能
(1)怎样把鼠标坐标转换tableView的索引
以下来自ChatGPT:
为了将鼠标坐标转换为tableView的索引,您可以使用QTableView的indexAt函数。该函数接受一个
QPoint参数,该参数表示鼠标点击的位置。它返回一个QModelIndex对象,该对象表示与该位置对应的模型索引。
以下是一个示例实现:
void MyWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
QPoint pos = event->pos();
QModelIndex index = tableView->indexAt(pos);
if (index.isValid()) {
// do something with the index
}
}
}
在此示例中,MyWidget是一个包含QTableView的窗口部件。mousePressEvent函数在鼠标按下时调用,并检查是否按下了左键。如果是,则获取鼠标位置并使用indexAt函数获取与该位置对应的模型索引。如果索引有效,则可以对其进行操作。
(2)QTableView去掉选择行
ui->tableView->selectionModel()->clearSelection();
(3)选择多行后再次点击空白处,怎样不被选择
选择多行
ui->tableView->setSelectionMode(QAbstractItemView::MultiSelection);
for(int j = 0;j < selectedItems.count();j++)
{
ui->tableView->selectRow(selectedItems.at(j));
}
再次点击改为扩展选择模式即可
if(!selectedItems.isEmpty() )//&& selectedItems.count() >1)
{
ui->tableView->selectionModel()->clearSelection();
ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
ui->tableView->selectRow(Index.row());
selectedItems.clear();
}