SOUI官方论坛

 找回密码
 立即注册
查看: 321|回复: 1

ListView中点击列表项中一个按钮和点击列表项事件区别处理

[复制链接]
  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    588

    帖子

    5479

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5479

    突出贡献优秀版主

    发表于 2022-7-12 15:52:07 | 显示全部楼层 |阅读模式
    有朋友的项目需要响应列表项点击事件,同时又需要响应列表项中的按钮的点击事件。由于列表项点击事件是作用于整个列表项的,因此按钮的点击事件也会触发列表项点击事件。
    如何实现点击按钮时不触发列表项点击事件呢?
    方法其它很简单,界面效果如下:
    QQ截图20220712154111.png
    点击列表中的删除按钮,不触发列表项点击事件。
    adapter代码如下:
    [C++] 纯文本查看 复制代码
        virtual void getView(int position, SWindow* pItem, pugi::xml_node xmlTemplate)
        {
            if (pItem->GetChildrenCount() == 0)
            {
                pItem->InitFromXml(xmlTemplate);
            }
    
            FieldInfo psi = m_vecFieldInfo.at(position);
            pItem->FindChildByName(L"txt_id")->SetWindowText(SStringT().Format(_T("%d"), position + 1));
            pItem->FindChildByName(L"txt_fieldName")->SetWindowText(psi.szFieldName);
            if (psi.iType == 0)
            {
                pItem->FindChildByName(L"txt_content")->SetWindowText(psi.szText);
                pItem->FindChildByName(L"txt_type")->SetWindowText(_T("文本"));
            }
            else if (psi.iType == 1)
            {
                pItem->FindChildByName(L"txt_content")->SetWindowText(psi.szPicPath);
                pItem->FindChildByName(L"txt_type")->SetWindowText(_T("图片"));
            }
            else
            {
                pItem->FindChildByName(L"txt_type")->SetWindowText(_T("未知字段类型"));
            }
    
            SButton* pBtnDelete = pItem->FindChildByName2<SButton>(L"btnDelete");
            pBtnDelete->SetUserData(position);
            pBtnDelete->GetEventSet()->subscribeEvent(EVT_CMD, Subscriber(&CTestMcAdapterFix::OnButtonClickDelete, this));
    
    
            pItem->SetUserData(position);
            pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID, Subscriber(&CTestMcAdapterFix::OnItemClick, this));
        }
    
        bool OnButtonClickDelete(EventArgs* pEvt)
        {
            SButton* pBtn = sobj_cast<SButton>(pEvt->sender);
            int iItem = pBtn->GetUserData();
    
            if (SMessageBox(NULL, SStringT().Format(_T("确定删除该字段吗"), iItem), _T("删除确认"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
            {
                //删除一条记录
                DeleteItem(iItem);
            }
            SLOG_INFO("on delete click");
            
            return true;
        }
    
        bool OnItemClick(EventArgs* pEvt)
        {
            SItemPanel* pItem = sobj_cast<SItemPanel>(pEvt->sender);
            int iItem = pItem->GetUserData();
    
    
            EventItemPanelClick* e2 = sobj_cast<EventItemPanelClick>(pEvt);
            CPoint pt(GET_X_LPARAM(e2->lParam), GET_Y_LPARAM(e2->lParam));
            SWND swnd = pItem->SwndFromPoint(pt);
            SWindow* pClick = SWindowMgr::GetWindow(swnd);
            if (pClick->GetID() != R.id.btnDelete)
            {
                SLOG_INFO("on item click");
            }
            return true;
        }
    


    关键在于OnItemClick的时候,通过EventItemPanelClick.lParam判断出点击位置即可。

    完整代码见附件。
    PrinterTools.zip (75 KB, 下载次数: 3, 售价: 2 SOUI币)
  • TA的每日心情
    奋斗
    2021-3-24 17:49
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    20

    帖子

    255

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    255
    发表于 2022-7-12 17:47:09 | 显示全部楼层
    牛批
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-4-25 21:12

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表