如何在Qt中获取selectionchange事件

8

我有一个继承自QWidget的类,在这个类中,我将创建一个QListView对象并填充要显示的项目。

当列表视图中的项目选择发生变化时,我想获取selectionChange事件。

我该如何实现这个功能?请简要告诉我。

2个回答

12

当你有一个视图时,你将拥有一个用于选择项的模型。它被称为QItemSelectionModel

例如,在使用QListView时,可以按以下方式获取选择模型:

QItemSelectionModel* selectionModel() const;

现在,通过该模型,您将能够连接许多信号:

void currentChanged ( const QModelIndex & current, const QModelIndex & previous )
void currentColumnChanged ( const QModelIndex & current, const QModelIndex & previous )
void currentRowChanged ( const QModelIndex & current, const QModelIndex &    previous )
void selectionChanged ( const QItemSelection & selected, const QItemSelection & deselected )

我认为这会对你有所帮助!


安迪,它有效了,非常感谢。但是我在遇到另一个问题:如果我在listviewitem上进行keypress事件,事件不会被激发。即使我重载了"keyPressEvent"方法,我仍然无法获取事件。如何将keypress事件安装到listview中?谢谢。 - Naruto
这就是事件的问题,你似乎必须使用不同“种类”的事件... 通过信号和槽,你只需要知道选择何时发生变化,而不用关心它是如何变化的... 无论如何,我建议在你的列表视图上添加一个事件过滤器... 在这里看看:https://dev59.com/70rSa4cB1Zd3GeqPWndN#1785307 - Andy M
谢谢,我会研究一下的。如果有问题,我会再联系你的。谢谢。 - Naruto
我正在使用Qt 4.8,只有selectionChanged对我起作用。谢谢。 - Ricardo Cristian Ramirez

0

https://doc.qt.io/archives/qt-4.8/qlistwidget.html 你可能想使用 QListWidget 而不是 view,我不记得具体原因,但这个类有你想要使用的这些信号。


https://doc.qt.io/archives/qt-4.8/qlistwidget.html#itemSelectionChanged 这是您需要连接的信号。

在您的类声明中创建一个槽:

 private slots:
     void selChanged();

在选择更改时,填充此插槽以执行您想要的操作。 在您的类中的某个地方将信号连接到此插槽 - 可能是在QWidget派生类的构造函数中。

 connect(yourListWidget, SIGNAL(itemSelectionChanged()), this, SLOT(selChanged()));

就是这样


我尝试了你建议的方法,但它没有成功。connect返回false,还有一件事,Qt文档说selectionchaged是一个虚拟槽,我尝试通过重载该槽来解决问题,但仍然不行。我不知道出了什么问题,请你帮忙看看。谢谢。 - Naruto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接