有表演。需要在按下鼠标按钮时接收事件或信号,其中将包含鼠标按下的元素的索引和鼠标坐标。
当鼠标悬停在视图中的条目上时按下鼠标按钮时,视图会发出一个void pressed(const QModelIndex &index)信号。如果您在视图中定义鼠标事件处理程序mousePressEvent(其中包含按下按钮的坐标),那么它将需要所有鼠标点击,并且不会发出按下的(const QModelIndex &index)信号。
class ListView : public QListView
{
Q_OBJECT
public:
ListView() {
connect(this, SIGNAL(pressed(const QModelIndex &)), this,
SLOT(getIndex(const QModelIndex &)));
}
void mousePressEvent(QMouseEvent* event) {
qDebug() << event->x() << event->y();
}
public slots:
void getIndex(const QModelIndex & index) {
qDebug() << index.row();
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QStringList list;
list << "a" << "b" << "c";
QStringListModel model;
model.setStringList(list);
ListView view;
view.setModel(&model);
view.show();
return app.exec();
}
实际上,如何确保在视图上按下鼠标按钮时,会捕获包含单击坐标和元素索引的信号或事件?
在类中,
QListView信号pressed仅在 mousePressEvent 事件处理程序中发送,并且您重新定义了此处理程序。所以你有两种方法。您必须通过坐标确定当前鼠标下的索引并发送信号
pressed。如果您正在实现 Qt 中不存在的真正新视图,则此方法适用。比如我在做一个图表视图,当我点击鼠标的时候,我查看了图表上的哪条线在鼠标的下方,并计算了索引。调用
mousePressEvent父类的方法。很可能,此方法仅适用于您的情况。您可以根据需要在覆盖方法中的任何位置调用父类方法。
UPD。原始方法
mousePressEvent是受保护的。您需要有充分的理由将其公开。