QComboBox的能够在setEditable模式下,只能增加而不能删除,注定了用户体研极差的,而且在输入有误时也没有任何办法,所以自定义comboBox
参考:Qt之QComboBox(基本应用、代理设置)_一去二三里_新浪博客
参考:QComboBox下拉框给选项增加删除按钮_龚建波-CSDN博客
直接上代码
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QComboBox>
#include <QListWidget>
#include <QPushButton>
#include <QMainWindow>
#include <QMouseEvent>
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QListWidgetItem>
namespace Ui {
class MainWindow;
}
class MyComboBox;
class ComboBoxItem : public QWidget
{
Q_OBJECT
public:
explicit ComboBoxItem(QWidget *parent = nullptr);
void setLabelText(QString text);
QString getLabelText();
signals:
void SignalDeleteClicked(const QString &text);
void SignalDeleteProperty(const QString &text);
void SignalShowClicked(const QString &text);
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
bool mouse_press;
QPushButton *btn;
QLabel *label;
};
class MyComboBox : public QComboBox
{
Q_OBJECT
public:
explicit MyComboBox(QWidget *parent = nullptr);
void MyAddItem(const QString &text);
public slots:
void SlotRemoveItem(const QString text);
void SlotRemoveProperty(const QString PropertyStr);
void SlotShowItem(const QString text);
protected:
void keyReleaseEvent(QKeyEvent *event);
private:
QListWidget *listWidget;
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
MyComboBox *comboBox;
};
#endif // MAINWINDOW_H
源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
comboBox = new MyComboBox(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
/* ComboBoxItem初始化 */
ComboBoxItem::ComboBoxItem(QWidget *parent):
QWidget(parent)
{
mouse_press = false;
QFont font;
font.setPixelSize(11);
btn = new QPushButton;
label = new QLabel;
btn->setFont(font);
label->setFont(font);
QPixmap pixmap("D:\\Data\\anyu\\AfterSaleServer\\Client\\AGS_AfterSale_Client\\ClearIco.png");
btn->setIcon(pixmap);
btn->setIconSize(pixmap.size());
btn->setStyleSheet("background:transparent;");
connect(btn,&QPushButton::clicked,[this]{
emit SignalDeleteClicked(label->text());
emit SignalDeleteProperty(property("count").toString());
});
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(label);
layout->addStretch();
layout->addWidget(btn);
layout->setContentsMargins(5, 5, 5, 5);
layout->setSpacing(5);
this->setLayout(layout);
}
/* 设置combobox当前显示文本 */
void ComboBoxItem::setLabelText(QString text)
{
label->setText(text);
}
/* 获取combobox当前显示文本 */
QString ComboBoxItem::getLabelText()
{
return label->text();
}
/* 用于combobox显示当前点击的文本 */
void ComboBoxItem::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton){
mouse_press = true;
}
}
/* 用于combobox显示当前点击的文本 */
void ComboBoxItem::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
if(mouse_press){
emit SignalShowClicked(label->text());
mouse_press = false;
}
}
/* 初始化 */
MyComboBox::MyComboBox(QWidget *parent): QComboBox(parent)
{
setStyleSheet("QComboBox QAbstractItemView::item {height : 30px ;}");
listWidget = new QListWidget();
// resize(200,50);
setModel(listWidget->model());
setView(listWidget);
clear();
setEditable(true); //设置QComboBox可编辑
for(int i=0; i<3; i++){
MyAddItem("设置QComboBox可编辑"+QString::number(i));
}
}
/* 自定义的添加item */
void MyComboBox::MyAddItem(const QString &text)
{
static int count = 0;
static int TextMaxLen = 0;
if(fontMetrics().width(text) > TextMaxLen){
TextMaxLen = fontMetrics().width(text);
}
resize(TextMaxLen+100,50);
ComboBoxItem *item = new ComboBoxItem();
item->setLabelText(text);
// connect(item,&ComboBoxItem::SignalDeleteClicked,this,&MyComboBox::SlotRemoveItem);
connect(item,&ComboBoxItem::SignalDeleteProperty,this,&MyComboBox::SlotRemoveProperty);
connect(item,&ComboBoxItem::SignalShowClicked,this,&MyComboBox::SlotShowItem);
QListWidgetItem *list_item = new QListWidgetItem(listWidget);
item->setProperty("count",QString::number(count++));
listWidget->setItemWidget(list_item, item);
qDebug() << item->size() << listWidget->itemWidget(list_item)->geometry();
}
/* 删除选择的文本,注意此处删除的是listwidget而不是combobox,combobox是一个空的内容 */
void MyComboBox::SlotRemoveItem(const QString text)
{
qDebug() << "SlotRemoveItem/text = " << text;
int list_count = listWidget->count();
for(int i=0; i < list_count;i++){
QListWidgetItem *item = listWidget->item(i);
ComboBoxItem *clickitem = static_cast<ComboBoxItem *>(listWidget->itemWidget(item));
QString LabelText = clickitem->getLabelText();
if(text == LabelText) {
listWidget->takeItem(i);
delete item;
break;
}
}
}
/* 删除选择的属性对应的item,因为文本可能重复,但是设置的属性是唯一的,注意此处删除的是listwidget而不是combobox,combobox是一个空的内容 */
void MyComboBox::SlotRemoveProperty(const QString PropertyStr)
{
qDebug() << "SlotRemoveProperty/text = " << PropertyStr;
int list_count = listWidget->count();
for(int i=0; i < list_count;i++){
QListWidgetItem *item = listWidget->item(i);
ComboBoxItem *clickitem = static_cast<ComboBoxItem *>(listWidget->itemWidget(item));
QString LabelText = clickitem->property("count").toString();
if(PropertyStr == LabelText) {
listWidget->takeItem(i);
delete item;
break;
}
}
}
/* 设置当前combobox的显示文本 */
void MyComboBox::SlotShowItem(const QString text)
{
qDebug() << "ShowItem/text = " << text;
setCurrentText(text);
hidePopup();
}
/* 判断combobox是否enter,是的话需要将自动创建的combobox的item删除掉,再自己主动创建 */
void MyComboBox::keyReleaseEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Enter|| event->key() == Qt::Key_Return){
QString text = currentText();
removeItem(count()-1);
MyAddItem(text);
setCurrentText(text);
// qDebug() << count() << listWidget->count();
// for(int i = 0;i < count();i++){
// qDebug() << itemText(i) << ((ComboBoxItem *)listWidget->itemWidget(listWidget->item(i)))->getLabelText();
// }
}
}