1. 程式人生 > 其它 >QT亂翻書-可編輯下拉複選框

QT亂翻書-可編輯下拉複選框

跳轉到大綱

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(const
QStringList& 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>