You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/iBase/iPlugin/ZxComboBox.h

71 lines
2.7 KiB
C

#pragma once
#include <QComboBox>
#include <QListView>
#include <QApplication>
#include <QDesktopWidget>
#include <QShowEvent>
#include <QFontMetrics>
#include <QStyleOptionComboBox>
#include <QPainter>
#include "Defines.h"
#include "iPlugin_global.h"
// 该类基于AI主要是控件显示内容的优化
// 默认隐藏箭头(可通过 setArrowHidden(false) 恢复),节省的空间全部留给文字显示
// 弹出视图自动计算宽度,根据所有选项文本的最大宽度动态调整
// 弹出位置自适应,防止在屏幕边缘被裁剪
// 文本省略号处理,当控件宽度不足时自动显示"...",但弹出时完整显示
// 支持动态调整:添加/删除/插入项目时自动重新计算弹出宽度
// 屏幕适配弹出宽度不超过屏幕的指定百分比默认80%
class I_PLUGIN_EXPORT ZxComboBox : public QComboBox
{
Q_OBJECT
public:
explicit ZxComboBox(QWidget *parent = 0);
~ZxComboBox();
// 设置是否启用动态箭头(根据文本长度自动显示/隐藏箭头)
void setDynamicArrowEnabled(bool enabled);
bool isDynamicArrowEnabled() const { return m_dynamicArrowEnabled; }
// 设置是否自动调整弹出视图宽度(默认开启)
void setAutoAdjustPopupWidth(bool autoAdjust);
bool autoAdjustPopupWidth() const { return m_autoAdjustPopupWidth; }
// 重载QComboBox的虚函数
virtual void addItem(const QString &text, const QVariant &userData = QVariant());
virtual void addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant());
virtual void addItems(const QStringList &texts);
virtual void insertItem(int index, const QString &text, const QVariant &userData = QVariant());
virtual void insertItem(int index, const QIcon &icon, const QString &text, const QVariant &userData = QVariant());
virtual void insertItems(int index, const QStringList &list);
virtual void removeItem(int index);
virtual void clear();
protected:
virtual void showEvent(QShowEvent *event);
virtual void paintEvent(QPaintEvent *event);
virtual void showPopup();
virtual void currentIndexChanged(int index);
virtual QSize sizeHint() const;
private:
void updatePopupViewWidth();
void adjustPopupPosition();
private:
bool m_dynamicArrowEnabled; // 是否启用动态箭头
bool m_arrowHidden; // 当前箭头是否隐藏(实际状态)
double m_popupWidthFactor; // 弹出视图宽度因子
bool m_autoAdjustPopupWidth; // 是否自动调整弹出宽度
int m_maxPopupWidthPercent; // 最大宽度百分比(相对于屏幕)
int m_cachedPopupWidth; // 缓存的计算宽度
};