C++ QListWidget itemClicked和itemDoubleClicked-如果双击,则阻止单次单击
到目前为止,我有这个代码,它运行良好:C++ QListWidget itemClicked和itemDoubleClicked-如果双击,则阻止单次单击,c++,qt,signals-slots,qlistwidget,C++,Qt,Signals Slots,Qlistwidget,到目前为止,我有这个代码,它运行良好: QObject::connect(mListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*))); QObject::connect(mListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetIt
QObject::connect(mListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*)));
QObject::connect(mListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*)));
问题是,每次我双击一个项目,就会执行itemClicked
槽
如果用户双击某个项目,我是否可以阻止
itemClicked
插槽?所以只需执行itemDoubleClicked
?实际上双击一个项目会产生itemClicked
和itemDoubleClicked
信号:单击+单击。您可以使用计时器,并在超时后检查itemDoubleClicked
信号是否在itemClicked
后不久出现,如果是,则忽略itemClicked
信号。多亏了vahancho的想法,才可以使用计时器。以下是我的解决方案:
YourClass.h
private:
QListWidgetItem* mSingleClickedItem;
bool mDoubleClicked;
private slots:
void itemClickedTimeout();
YourClass.cpp
void YourClass::itemClicked(QListWidgetItem* listWidgetItem) {
if (!mDoubleClicked) {
QTimer::singleShot(300, this, SLOT(itemClickedTimeout()));
// use QApplication::doubleClickInterval() instead of 300
mSingleClickedItem = listWidgetItem;
}
}
void YourClass::itemClickedTimeout() {
if (!mDoubleClicked) {
// do something, listitem has been clicked once
} else mDoubleClicked = false;
}
void YourClass::itemDoubleClicked(QListWidgetItem* listWidgetItem) {
mDoubleClicked = true;
// do something, listitem has been clicked twice
}
这里面没有什么东西吗?计时器对我来说似乎是一个肮脏的解决方案。@Niklas,我同意,这很棘手,但我不知道有任何内置的解决方案。我发布了我的解决方案。谢谢你的主意