Qt QComboBox下拉线宽选择
在网上搜了一下没有找到 QComboBox下拉线宽选择的救命,只有下拉颜色的选择,引用链接如下:https://www.cnblogs.com/chechen/p/12219644.html,然后仿着颜色的示例写了一个(稍微改一下就可以进行线样式选择),以实现以下效果:
原理比较简单就不讲解了,下面是实现代码:
#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;
}