Qt QWidgetList::itemClicked不触发
一、概述
在优化Qt代码的时候发现以前写的List的item的触发事件用的是鼠标事件。而itemClicked信号对应的槽函数onItemClicked函数压根没触发。
void mousePressEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event); void leaveEvent(QEvent* event);
然后就在回想好好的item点击事件为啥不用,反而用鼠标事件。之后发现是因为做东西着急但是itemClicked函数不触发,所以就用了鼠标事件。
今天刚好抽空把为啥itemClicked不触发这块给弄一下。
测试结果发现代码写的并没有什么问题。之所以因为itemClicked事件不触发是因为上面的鼠标事件把把itemClicked事件给屏蔽了。测试的过程中发现只要把鼠标事件屏蔽掉,itemClicked信号只要写对就能触发itemClicked。
下面记录一下示例及可能遇到的问题。
二、示例
1.itemClicked信号属于QWidgetList对象,如下
Q_SIGNALS: void itemPressed(QListWidgetItem *item); void itemClicked(QListWidgetItem *item); void itemDoubleClicked(QListWidgetItem *item); void itemActivated(QListWidgetItem *item); void itemEntered(QListWidgetItem *item); // ### Qt 6: add changed roles void itemChanged(QListWidgetItem *item); void currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); void currentTextChanged(const QString ¤tText); void currentRowChanged(int currentRow); void itemSelectionChanged();
2.有两种方式可以出发itemClicked函数
a.第一种方式最为简单,使用lambda表达式,此方法的优点是无需定义槽函数
connect(this, &CommonListView::itemClicked, [=](QListWidgetItem* item) {
CommonListViewItem* item2 = dynamic_cast<CommonListViewItem*>(item);
qDebug() << "itemPos:" << item2->mPos;
});
b.第二种方式是定义一个槽函数,并使用槽函数
//定义槽函数
public slots: void onItemClicked(QListWidgetItem* item);
//使用槽函数
connect(this, &CommonListView::itemClicked, this,&CommonListView::onItemClicked);
ps:总结,亲测有效,放心使用。
浙公网安备 33010602011771号