QT之动态加载下拉框(QComboBox)

文章介绍了如何在QT的QComboBox中实现动态加载数据以及在下拉选项中显示动态GIF图片。通过自定义ListWidgetItem类,利用QMovie播放GIF并实时更新Icon。同时,通过重写QComboBox并设置事件过滤器,捕获鼠标事件来控制特定选项的额外操作。
摘要由CSDN通过智能技术生成

QT之动态加载下拉框(QComboBox)

简介

这两天遇到一个需求,需要下拉选项中动态加载一些数据,实现之后感觉挺有意思,特此记录一下。

效果

还是先看下效果,源码也放在文末了
在这里插入图片描述

原理分析

要实现此类效果,要拆解下功能项:

  • 第一步,下拉选项的item要能够显示动态图片
  • 第二步,拦截ComboBox的鼠标事件,使得再点击特定得节点后可以执行一些额外得操作,并且不隐藏下拉框

实现

分解了功能点,接下来就可以实现代码了:
首先让QListWidgetItem能够显示动态图标,QT控件得setIcon接口原生是不支持显示动态图片的,那怎么实现呢?
我的方法是,封装一个MyListWidgetItem类,类成员包含QListWidgetItem,并且使用QMovie播放gif图片,获取每帧并实时更新Icon。实现代码如下:
Ps:有大佬有更好的办法望指教
ListWidgetItem.h

#ifndef ListWidgetItem_H
#define ListWidgetItem_H

#include <QObject>
#include <QIcon>
#include <QMovie>
#include <QTimer>

class QListWidgetItem;
class ListWidgetItem : public QObject
{
    Q_OBJECT
public:
    explicit ListWidgetItem(const QString& text,QObject *parent = nullptr);
    explicit ListWidgetItem(const QIcon& _icon,const QString& text,QObject *parent = nullptr);
    ~ListWidgetItem();

    void setGifPath(const QString& path);
    QListWidgetItem* getItem();

    void start();
    void stop();

protected slots:
    void slot_timeOut();

private:
    void connectAll();

private:
    QListWidgetItem *m_item = nullptr;
    QIcon m_icon;
    QString m_gifPath;

    QTimer m_timer;
    QMovie m_movie;

};

#endif // ListWidgetItem_H

ListWidgetItem.cpp

#include "ListWidgetItem.h"

#include <QListWidgetItem>
#include <QApplication>

ListWidgetItem::ListWidgetItem(const QString &text, QObject *parent)
    : QObject(parent)
{
    m_item = new QListWidgetItem(text);
    m_item->setData(Qt::UserRole+1,qint64(this));
    connectAll();
}

ListWidgetItem::ListWidgetItem(const QIcon &_icon, const QString &text, QObject *parent) : QObject(parent)
{
    m_item = new QListWidgetItem(_icon,text);
    m_item->setData(Qt::UserRole+1,qint64(this));
    m_icon = _icon;
    connectAll();
}

ListWidgetItem::~ListWidgetItem()
{

}

void ListWidgetItem::setGifPath(const QString &path)
{
    m_gifPath = path;
    m_movie.setFileName(m_gifPath);
}

QListWidgetItem *ListWidgetItem::getItem()
{
    return m_item;
}

void ListWidgetItem::start()
{
//    m_movie.setSpeed(100);
    m_movie.start();
    m_timer.start(30);
}

void ListWidgetItem::stop()
{
    m_movie.stop();
    m_timer.stop();
    m_item->setIcon(m_icon);
}

void ListWidgetItem::slot_timeOut()
{
    if(nullptr == m_item)
    {
        return;
    }

    QPixmap pix = m_movie.currentPixmap();
    m_item->setIcon(pix);
//    m_timer.stop();
}

void ListWidgetItem::connectAll()
{
    connect(&m_timer,&QTimer::timeout,this,&ListWidgetItem::slot_timeOut);
}

然后,过滤ComboBox的鼠标事件,并实现播放动画和其他操作,实现方式为:
重写QComboBox,并为其view()->viewport()安装事件过滤器,监听鼠标弹起事件QEvent::MouseButtonRelease。关键代码如下

DynamicBox::DynamicBox(QWidget *parent)
    : QComboBox(parent)
{
    if(this->view() != nullptr)
    {
        this->view()->installEventFilter(this);
        this->view()->viewport()->installEventFilter(this);
    }
}

bool DynamicBox::eventFilter(QObject *o, QEvent *e)
{
    auto index = this->view()->currentIndex();
    if(e->type() == QEvent::MouseButtonRelease && index.data().toString() == "加载更多")
    {
        auto item = static_cast<QListWidgetItem*>(index.internalPointer());
        if(nullptr == item)
        {
            return false;
        }

        auto Myitem = (ListWidgetItem*)(item->data(Qt::UserRole+1).toLongLong());
        if(nullptr == Myitem)
        {
            return false;
        }
        Myitem->start();
        QTimer::singleShot(3000,this,[Myitem,this](){
            Myitem->stop();
            emit signal_test(this);
        });

        return true;
    }
    return QComboBox::eventFilter(o,e);
}

做完这些后就能实现图中效果啦~

源码下载在这里

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要创建一个 QT 窗口和一个下拉菜单。你可以使用 QT Designer 来创建它们。然后,你需要将 QT 窗口嵌入到 Auto CAD 中。这可以通过 ObjectARX 中的 AcApGetMainWnd 函数来实现。 接下来,你需要将下拉菜单添加到 QT 窗口中。这可以使用 QT 中的 QComboBox 类来实现。你需要在 QComboBox 中添加所有的选项,如下所示: ``` QComboBox *comboBox = new QComboBox(); comboBox->addItem("Option 1"); comboBox->addItem("Option 2"); comboBox->addItem("Option 3"); ``` 然后,你需要将 QT 窗口嵌入到 Auto CAD 中,并将下拉菜单添加到 Auto CAD 的菜单栏中。这可以使用 ObjectARX 中的 AcMenuBar 类来实现。你需要创建一个 AcMenuBar 对象,并使用 AddMenuBar 方法将其添加到 Auto CAD 的菜单栏中。然后,你需要使用 AddMenu 方法将一个新菜单添加到 AcMenuBar 对象中。最后,你需要使用 AddMenuItem 方法将 QComboBox 添加到新菜单中。 下面是一个示例代码: ``` void AddComboBoxToMenu() { // 获取 Auto CAD 主窗口 HWND hwndCAD = acedGetAcadHwnd(); // 创建 QT 窗口 QWidget *pQTWidget = new QWidget; QComboBox *pComboBox = new QComboBox(pQTWidget); pComboBox->addItem("Option 1"); pComboBox->addItem("Option 2"); pComboBox->addItem("Option 3"); // 将 QT 窗口嵌入到 Auto CAD 中 AcApGetMainWnd()->SetWindowLongPtr(GWLP_HWNDPARENT, (LONG_PTR)hwndCAD); pQTWidget->winId(); // 将下拉菜单添加到 Auto CAD 的菜单栏中 AcMenuBar *pMenuBar = new AcMenuBar; pMenuBar->AddMenuBar(); AcMenu *pMenu = pMenuBar->AddMenu(_T("MyMenu")); pMenu->AddMenuItem(_T("MyComboBox"), (long)pQTWidget->winId()); } ``` 注意,这只是一个简单的示例代码,并且可能需要根据你的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值