Qt QComboBox下拉线宽选择

在网上搜了一下没有找到 QComboBox下拉线宽选择的救命,只有下拉颜色的选择,引用链接如下:https://www.cnblogs.com/chechen/p/12219644.html,然后仿着颜色的示例写了一个(稍微改一下就可以进行线样式选择),以实现以下效果:

Qt QComboBox下拉线宽选择

原理比较简单就不讲解了,下面是实现代码:

#ifndef Q_PEN_COMBOBOX_H
#define Q_PEN_COMBOBOX_H

#include<QComboBox>
#include<QLabel>
#include<QLineEdit>
#include<QListWidget>

#include"userdefinectrl_global.h"


class USERDEFINECTRL_EXPORT QPenCssEditor :public QLabel
{
    Q_OBJECT
public:
    QPenCssEditor(QWidget *parent = Q_NULLPTR);
    ~QPenCssEditor();

    void SetDrawParameters(int drawType, int isize);
    void paintEvent(QPaintEvent *) override;
private:
    int m_drawType;//画点,还是画线
    int m_size;//大小
};


class USERDEFINECTRL_EXPORT QPenWidget : public QLineEdit
{
    Q_OBJECT
public:
    QPenWidget(QWidget *parent = Q_NULLPTR);
    ~QPenWidget();

    void updatePen(const int& index, const int& type);

    void mousePressEvent(QMouseEvent *event);

signals:
    void click(const int& index);
private:
    QLabel* m_pLabel;
    QPenCssEditor* m_pCssLabel;
    int m_index;
    int m_type;
};


class USERDEFINECTRL_EXPORT QPenCombobox :public QComboBox
{
    Q_OBJECT
public:
    QPenCombobox(QWidget *parent = Q_NULLPTR);
    ~QPenCombobox();

    void SetType(int drawType);

    int GetCurrentIndex();
    void SetCurrentIndex(int idx);

    void SetList(QList<int>&list);
    QList<int> GetList();

    private slots:
    void onClickPenWidget(const int& index);

signals:
    void SelectedItemChanged(int);

private:
    void appendItem(const int& index);
private:
    QPenWidget* m_pPenEdit;
    QListWidget* m_pListWidget;
    QList<QColor> m_colorsList;
    int m_drawType;
    int m_index;
    QList<int> m_list;
};
#endif

 

#include"QPenCombobox.h"
#include<QHBoxLayout>
#include<QPainter>
#include<QPaintEvent>
#include<QPoint>
#include<QLine>

QPenCssEditor::QPenCssEditor(QWidget *parent /*= Q_NULLPTR*/)
    :QLabel(parent)
    , m_drawType(0)
    , m_size(1)
{

}


QPenCssEditor::~QPenCssEditor()
{

}

void QPenCssEditor::SetDrawParameters(int drawType, int isize)
{
    m_drawType = drawType;
    m_size = isize;
}


void QPenCssEditor::paintEvent(QPaintEvent *event)
{
    QSize size = this->size();
    QPainter painter(this);
    QPen pen;
    pen.setColor(Qt::black);
    pen.setWidth(m_size);
    painter.setPen(pen);
    if (m_drawType == 0)
        painter.drawPoint(QPoint(size.width() / 2, size.height() / 2));
    else
    {

        QPoint p1(0, size.height() / 2);
        QPoint p2(size.width(), size.height() / 2);
        QLine line(p1, p2);
        painter.drawLine(line);
    }
}


QPenWidget::QPenWidget(QWidget *parent /*= Q_NULLPTR*/)
    :QLineEdit(parent)
    , m_index(0)
    , m_type(0)
{
    m_pLabel = new QLabel();
    m_pCssLabel = new QPenCssEditor();

    m_pLabel->setFixedSize(12, 12);

    QHBoxLayout* layout = new QHBoxLayout();
    layout->addWidget(m_pLabel);
    layout->addWidget(m_pCssLabel);
    layout->setContentsMargins(5, 0, 0, 2);
    setLayout(layout);
    setReadOnly(true);

    setStyleSheet("QLineEdit{border: none;}QLineEdit:hover{background-color:rgb(0,125,255);}");
}


QPenWidget::~QPenWidget()
{

}

void QPenWidget::updatePen(const int& index, const int& type)
{
    m_index = index;
    m_type = type;

    QString strText = QString("%1 )").arg(QString::number(m_index));
    m_pLabel->setText(strText);
    m_pCssLabel->SetDrawParameters(type, index);

}

void QPenWidget::mousePressEvent(QMouseEvent *event)
{
    emit click(m_index);
}

QPenCombobox::QPenCombobox(QWidget *parent /*= Q_NULLPTR*/)
    :QComboBox(parent)
{
    m_pPenEdit = new QPenWidget();
    m_pListWidget = new QListWidget();
    m_pPenEdit->setStyleSheet("");
    setContextMenuPolicy(Qt::NoContextMenu);//禁用菜单
    m_pListWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//禁用垂直滚动条
    m_pListWidget->setStyleSheet("QListWidget::Item:hover{background-color:rgb(0,125,255);}");
    setLineEdit(m_pPenEdit);
    setModel(m_pListWidget->model());
    setView(m_pListWidget);

}

QPenCombobox::~QPenCombobox()
{
}

void QPenCombobox::SetType(int drawType)
{
    m_drawType = drawType;
}

void QPenCombobox::appendItem(const int& index)
{
    QPenWidget* pWid = new QPenWidget(this);
    pWid->updatePen(index, m_drawType);
    connect(pWid, SIGNAL(click(const int&)), this, SLOT(onClickPenWidget(const int& )));
    QListWidgetItem* pItem = new QListWidgetItem(m_pListWidget);

    m_pListWidget->addItem(pItem);
    m_pListWidget->setItemWidget(pItem, pWid);

}

void QPenCombobox::onClickPenWidget(const int& index)
{
    m_index = index;
    m_pPenEdit->updatePen(index, m_drawType);
    hidePopup();
    emit SelectedItemChanged(m_index);
}


int QPenCombobox::GetCurrentIndex()
{
    return m_index;
}

void QPenCombobox::SetCurrentIndex(int index)
{
    m_index = index;
    m_pPenEdit->updatePen(index, m_drawType);
}

void QPenCombobox::SetList(QList<int>&list)
{
    m_list = list;
    m_pListWidget->clear();
    int icount = m_list.count();
    for (int i = 0; i < icount; i++)
        appendItem(m_list[i]);
}

QList<int> QPenCombobox::GetList()
{
    return m_list;
}