代码之家  ›  专栏  ›  技术社区  ›  Niklas

QListWidget itemClicked和itemDoubleClicked-如果双击,则阻止单击

  •  0
  • Niklas  · 技术社区  · 11 年前

    到目前为止,我有这段代码,运行良好:

    QObject::connect(mListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(itemDoubleClicked(QListWidgetItem*)));
    QObject::connect(mListWidget, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(itemClicked(QListWidgetItem*)));
    

    问题是,每次我双击一个项目时 itemClicked 插槽被执行。

    我能阻止 项目已单击 如果用户双击某个项目,则显示插槽?所以只是 itemDoubleClicked 被处决?

    2 回复  |  直到 11 年前
        1
  •  1
  •   vahancho    11 年前

    实际上,双击一个项目会同时产生 itemClicked itemDoubleClicked 信号:单击+单击。您可以使用计时器,并在超时后检查 项目双击 不久后出现信号 项目已单击 ,如果是,则忽略 项目已单击 信号

        2
  •  0
  •   kocica    6 年前

    感谢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
    }