zoukankan      html  css  js  c++  java
  • QAbstractItemView区分单双击

     

    系统不可能知道你这一次单击鼠标是为了双击指令,所以在你第一次按下鼠标时,系统会发出一个WM_XBUTTONDOWN(也就是clicked),

    当你第二次单击鼠标时,系统先发送WM_XBUTTONDOWN,然后发现距离上一次单击鼠标间隔不到N毫秒(注册表中设置),于是发出双击消息,程序收到消息,调用doubleClicked

    QWidget中一次双击只会触发一次单击和一次双击事件。

    而在QAbstractItemView中,如果设置void setEditTriggers ( EditTriggers triggers ) 禁用了双击鼠标编辑功能,则:

    一次双击中调用次序是clicked、doubleClicked、clicked。

    解决双击会触发两次单击,方法:

    https://wenku.baidu.com/view/7a6e9b5d03d8ce2f01662342.html

    #include "testclick.h"
    #include <qdebug.h>
    #include <QKeyEvent>
    #include <QStringListModel>
    
    TestClick::TestClick(QWidget *parent, Qt::WFlags flags)
        : QMainWindow(parent, flags)
    {
        ui.setupUi(this);
    
        m_pTimer = new QTimer(this);
        m_bDouble = false;
    
    
    
        QStringList leaders;
        leaders<<"qq"<<"aa"<<"zz"<<"ww"<<"ss"<<"xx";
        QStringListModel *model = new QStringListModel();
        model->setStringList(leaders);
        ui.listView->setModel(model);
        ui.listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    
        connect(ui.listView,SIGNAL(clicked(const QModelIndex&)),this, SLOT(slot_click(const QModelIndex&)));
        connect(ui.listView,SIGNAL(doubleClicked(const QModelIndex&)),this, SLOT(slot_DbClick(const QModelIndex&)));
        connect(m_pTimer, SIGNAL(timeout()),this, SLOT(slot_timeOut()));
    
    }
    
    TestClick::~TestClick()
    {
    
    }
    
    
    void TestClick::slot_click(const QModelIndex& mi)
    {
        //qDebug() << "slot_click";
        if (!m_bDouble)
        {
            m_pTimer->start(120);
        }
    
        m_bDouble = false;
    }
    
    void TestClick::slot_DbClick(const QModelIndex& mi)
    {
        //qDebug() << "slot_DbClick";
        m_bDouble = true;
        m_pTimer->stop();
    
        this->run_DbClick();
    }
    
    void TestClick::slot_timeOut()
    {
        if (!m_bDouble)
        {
            this->run_Click();
        }
    }
    
    //单击调用
    void TestClick::run_Click()
    {
    
    }
    
    //双击调用
    void TestClick::run_DbClick()
    {
    
    }
  • 相关阅读:
    OCI读取单条记录(C)
    共享内存shmget shmat shmdt
    Linux系统下的多线程编程入门
    如何让errno多线程/进程安
    linux的mount(挂载)命令详解
    取得系统时间并以BCD形式保存到字符串中
    电脑上的搜索功能用不了了,怎么办?
    如何建立Linux下的ARM交叉编译环境
    C#网络编程之Http请求
    深入了解Oracle前滚恢复rolling forward(一)
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/7765963.html
Copyright © 2011-2022 走看看