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,我同意,这很棘手,但我不知道有任何内置的解决方案。我发布了我的解决方案。谢谢你的主意