最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

自定义控件支持鼠标矩形选择

Qt 阿虚 630浏览 0评论

.    最近在做一个东西,使用Qt开发的。有一个鼠标功能就是需要支持鼠标矩形多选的功能。这个功能就是那种Windows文件夹中鼠标拉出矩形就能选中矩形内的文件。这个功能实在是把我卡了心浮气躁的。百度搜索不到结果。(当时太急躁选的关键字有误。)CSDN也没有满意的答案(只有一位版主id:u013466477 冷静忍耐 耐心解答。虽然最后没用成功。。当时我提问的帖子在这http://bbs.csdn.net/topics/391860429。当时真是头疼死我了。)

.    后来因为其他事情那个功能停工了。最近又得需要接起来,决定好好的看看Qt文档QAbstractItemView的子类化。。(某道词典的实时翻译。。教练,我要学英语..(/TДT)/)结果还真被我在里面找到了。。。Qt以及封装好了一个类。。QRubberBand类。。。这个类就是实现在自己的窗口布局上画出一个新的矩形来的。就是Windows文件夹拉选功能一模一样。。使用后可行直接整个人都HI起来了。

. 不过QRubberBand他的功能仅仅是能够在你的窗口最顶层帮你画一个矩形出来。并不会帮你主动选择矩形范围内的控件。QRubberBandMember->frameGeometry()这个函数能够帮助你获取到鼠标拉选出来的矩形在父窗口的X,Y,矩形宽,高。你得自己判断控件是否在当前矩形范围内。如何判断看这篇从网上搬运来的文章:《判断两矩形是否交叉(包括包含的情况)》.(教练,我要学数学..(/TДT)/)

/*
    你需要重写鼠标的三个保护函数:mousePressEvent, mouseMoveEvent,mouseReleaseEvent和paintEvent(paintEvent想了想可有可无的重写,自己封装成成员函数一样。) 
*/
void CImageView::mousePressEvent(QMouseEvent *event)
{
    QWidget::mousePressEvent(event);
    origin = event->pos();
    if (!rubberBand)
        rubberBand = new QRubberBand(QRubberBand::Rectangle, this);

    rubberBand->setGeometry(QRect(origin, QSize()));
    rubberBand->show();
}

void CImageView::mouseMoveEvent(QMouseEvent *event)
{
    if (rubberBand)
        rubberBand->setGeometry(QRect(origin, event->pos()).normalized());

    rubbsize = rubberBand->frameGeometry();
     
    m_start = true;
    update();  //更新窗口
    QWidget::mouseMoveEvent(event);
}

void CImageView::mouseReleaseEvent(QMouseEvent *event)
{
    QWidget::mouseReleaseEvent(event);
    if (rubberBand)
        rubberBand->hide(); 
    
    rubbsize = rubberBand->frameGeometry(); 
    m_start = true;
    update();//更新窗口
}

void CImageView::paintEvent(QPaintEvent * event)
{ 
    //这个标记是为何判断是否是拉出的矩形窗口。
    //并非一定要重写这个paintEvent,你也可以封装成一个成员函数。
    //并且这个函数应该是你自己写控件在选择的矩形中该如何显示的代码。下面是我的程序中的代码。你拷贝了也没用。
    if (m_start == true)
    {  
        m_start = false; 
        int n = m_ImagePtr.size();
        for (int i = 1; i <= n; i++)
        {
            map<int, CControlImage*>::iterator it = m_ImagePtr.find(i);
            if (it == m_ImagePtr.end())
                continue;

            //通过迭代器获取自定义窗口在父控件布局上的X,Y,W,H。
            QRect rect = (*it).second->frameGeometry(); 
            //判断当前控件是否在鼠标拉出矩形范围内
            if (IsIntersect(&rect, &rubbsize))
                (*it).second->SetClicked(); //是的则设置背景亮显示
            else
                (*it).second->ReSetClicked(); //不是的则背景设置白色
        } 
    }
}

转载请注明:虚无 » 自定义控件支持鼠标矩形选择

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址