QT亂翻書-可編輯下拉複選框
阿新 • • 發佈:2022-01-12
QT亂翻書-可編輯下拉複選框
#ifndef XIALAWIDGET_H #define XIALAWIDGET_H #include <QWidget> #include<QListWidget> #include<QLineEdit> QT_BEGIN_NAMESPACE namespace Ui { class XiaLaWidget; } QT_END_NAMESPACE class XiaLaWidget : public QWidget { Q_OBJECT public: XiaLaWidget(QWidget*parent = nullptr); ~XiaLaWidget(); private: QListWidget *pListWidget; QLineEdit *pLineEdit; //所有的選項 QStringList selectText; //選中的選項 QStringList selectedText; //處理選擇操作訊號 void stateChanged(int state); public slots: //接收傳入資料 text1為所有選項,text2為選中的選項 void revSelectedText(constQStringList& text1, const QStringList& text2); signals: //將最終選中的選項傳送出去. void sendSelectedText(const QStringList&); private: Ui::XiaLaWidget *ui; }; #endif // XIALAWIDGET_H
#include "xialawidget.h" #include "ui_xialawidget.h" #include<QtDebug> #include<QCheckBox> #include<QDebug> #include<QComboBox> XiaLaWidget::XiaLaWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::XiaLaWidget) { ui->setupUi(this); //combox設定屬性 ui->comboBox->setInsertPolicy(QComboBox::InsertAtTop); //兩個控制元件,用以combox替代 pListWidget = new QListWidget(this); pLineEdit = new QLineEdit(this); //*如果設定可編輯 pLineEdit->setReadOnly(false); pLineEdit->setReadOnly(false); //設定給combox ui->comboBox->setModel(pListWidget->model()); ui->comboBox->setView(pListWidget); ui->comboBox->setLineEdit(pLineEdit); //槽函式,處理QComboBox::textActivated. 加入新增選項並選中 connect(ui->comboBox, QOverload<const QString &>::of(&QComboBox::textActivated), [ = ](const QString & text) { qDebug() << "[ = ](const QString & text) { " << text; //逗號分割,新增選項加入pListWidget if(text != "") { //新增專案已經加入到了pListWidget中,精準查詢 QList<QListWidgetItem*> lwis = pListWidget->findItems(text, Qt::MatchExactly); qDebug() << "size" << lwis.size(); QListWidgetItem* newText = lwis.at(0); QStringList sl = newText->text().replace(",", ",").trimmed().split(","); //新專案新增到了top位置,我們先刪掉,然後重新分解加入pListWidget pListWidget->model()->removeRow(0); //for迴圈新增新的選項a,b,c, for(int ix = 0; ix < sl.length(); ix++) { QString tmp = sl.at(ix); if(tmp != "" && selectText.count(tmp) == 0) { revSelectedText(QStringList(tmp), QStringList(tmp)); } } stateChanged(Qt::Checked); } }); //測試資料 QStringList myList; myList.append("option01"); myList.append("option02"); myList.append("option03"); myList.append("option04"); myList.append("option05"); myList.append("option06"); myList.append("option07"); revSelectedText(myList, QStringList()); } XiaLaWidget::~XiaLaWidget() { qDebug() << "XiaLaWidget::~XiaLaWidget()"; delete ui; } void XiaLaWidget::stateChanged(int state) { qDebug() << "void XiaLaWidget::stateChanged(int state) " << state; //state 選中是2,取消選中是0. QString lineText;//把選擇的內容顯示到pLineEdit. selectedText.clear();//把選擇的內容記錄到selectedText. int nCount = pListWidget->count(); //for迴圈把選擇的內容提取到兩個變數裡待用.為啥要用兩個變數呢?因為任性. for (int i = 0; i < nCount; ++i) { QListWidgetItem *pItem = pListWidget->item(i); QWidget *pWidget = pListWidget->itemWidget(pItem); QCheckBox *pCheckBox = (QCheckBox *)pWidget; if (pCheckBox->isChecked()) { QString strText = pCheckBox->text(); //用逗號隔開 lineText.append(strText).append(","); selectedText.append(strText); } } if (!lineText.isEmpty()) { pLineEdit->setText(lineText); pLineEdit->setToolTip(lineText); } else { pLineEdit->clear(); selectedText.clear(); } qDebug() << "your choese nums:" << selectedText; //把選擇的資料通過訊號傳送出去. emit sendSelectedText(selectedText); } void XiaLaWidget::revSelectedText(const QStringList& text1, const QStringList& text2) { qDebug() << "XiaLaWidget::revSelectedText "; for(int ix = 0; ix < text1.length(); ix++) { QString six = text1.at(ix); if(selectText.count(six) == 0) { QListWidgetItem *pItem = new QListWidgetItem(pListWidget); QCheckBox *pCheckBox = new QCheckBox(pListWidget); pCheckBox->setText(six); pItem->setData(Qt::UserRole, pCheckBox->text()); pListWidget->addItem(pItem); selectText.append(six); pListWidget->setItemWidget(pItem, pCheckBox); //當複選框狀態發生變化時 connect(pCheckBox, &QCheckBox::stateChanged, this, &XiaLaWidget::stateChanged); if(text2.count(six) > 0) { pCheckBox->setCheckState(Qt::Checked); } } } }
/******************************************************************************** ** Form generated from reading UI file 'xialawidget.ui' ** ** Created by: Qt User Interface Compiler version 5.15.2 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ #ifndef UI_XIALAWIDGET_H #define UI_XIALAWIDGET_H #include <QtCore/QVariant> #include <QtWidgets/QApplication> #include <QtWidgets/QComboBox> #include <QtWidgets/QVBoxLayout> #include <QtWidgets/QWidget> QT_BEGIN_NAMESPACE class Ui_XiaLaWidget { public: QVBoxLayout *verticalLayout; QComboBox *comboBox; void setupUi(QWidget *XiaLaWidget) { if (XiaLaWidget->objectName().isEmpty()) XiaLaWidget->setObjectName(QString::fromUtf8("XiaLaWidget")); XiaLaWidget->resize(193, 50); verticalLayout = new QVBoxLayout(XiaLaWidget); verticalLayout->setSpacing(0); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); verticalLayout->setContentsMargins(0, 0, 0, 0); comboBox = new QComboBox(XiaLaWidget); comboBox->setObjectName(QString::fromUtf8("comboBox")); comboBox->setEditable(false); verticalLayout->addWidget(comboBox); retranslateUi(XiaLaWidget); QMetaObject::connectSlotsByName(XiaLaWidget); } // setupUi void retranslateUi(QWidget *XiaLaWidget) { XiaLaWidget->setWindowTitle(QCoreApplication::translate("XiaLaWidget", "XiaLaWidget", nullptr)); } // retranslateUi }; namespace Ui { class XiaLaWidget: public Ui_XiaLaWidget {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_XIALAWIDGET_H
#include "xialawidget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); XiaLaWidget w; w.show(); return a.exec(); }
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>XiaLaWidget</class> <widget class="QWidget" name="XiaLaWidget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>193</width> <height>50</height> </rect> </property> <property name="windowTitle"> <string>XiaLaWidget</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <property name="spacing"> <number>0</number> </property> <property name="leftMargin"> <number>0</number> </property> <property name="topMargin"> <number>0</number> </property> <property name="rightMargin"> <number>0</number> </property> <property name="bottomMargin"> <number>0</number> </property> <item> <widget class="QComboBox" name="comboBox"> <property name="editable"> <bool>false</bool> </property> </widget> </item> </layout> </widget> <resources/> <connections/> </ui>