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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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; // 缓存的计算宽度
};