QComboBox是表示组合框的类,它提供一个下拉列表供用户选择,同时也带有一个单行编辑框,以接受用户输入的文本。QComboBox下拉列表中的每个列表项,还可以与一个QVariant类型的用户数据相关联。
组合框中的列表项可以在Qt设计师中添加或删除,也可以通过QComboBox类的特定方法在代码中添加或删除。每个列表项既可以带有图标,也可以关联用户数据:
xxxxxxxxxx
41void QComboBox::addItem(const QString& text, const QVariant& userData = QVariant());
2void QComboBox::addItem(const QIcon& icon, const QString& text, const QVariant& userData = QVariant());
3void QComboBox::addItems(const QStringList& texts);
4void QComboBox::clear();
QComboBox不提供获取整个列表的功能,但可以获取当前选择项,或通过索引获取指定项:
xxxxxxxxxx
61int QComboBox::currentIndex(); // 返回当前项的索引
2QString QComboBox::currentText(); // 返回当前项的文本
3QVariant QComboBox::currentData(int role = Qt::UserRole); // 返回当前项的用户数据
4QString QComboBox::itemText(int index); // 返回指定项的文本
5QVariant QComboBox::itemData(int index, int role = Qt::UserRole); // 返回指定项的用户数据
6int QComboBox::count(); // 返回项的总数
当用户在组合框的下拉列表中改变选择项时,QComboBox会发射如下两个信号:
xxxxxxxxxx
21void QComboBox::currentIndexChanged(int index); // 参数为当前选择项的索引
2void QComboBox::currentIndexChanged(const QString& text); // 参数为当前选择项的文本
通过定义与之相连的槽函数,可以针对选择项的变化,执行相应的业务处理。
QComboBox提供如下方法获取和设置组合框的可编辑属性:
xxxxxxxxxx
21bool QComboBox::isEditable() const
2void QComboBox::setEditable(bool editable);
QPlaintTextEdit是表示纯文本编辑框的类,可以显示和编辑多行纯文本内容,同时提供默认的右键菜单功能。
QPlainTextEdit类提供如下方法用于在代码中添加和删除编辑框中的文本:
xxxxxxxxxx
21void QPlainTextEdit::appendPlainText(const QString& text);
2void QPlainTextEdit::clear();
可以一次性获取编辑框中的文本整体:
xxxxxxxxxx
11QString QPlainTextEdit::toPlainText() const;
也可以逐行获取编辑框中的多行文本:
xxxxxxxxxx
41QTextDocument* QPlainTextEdit::document() const;
2int QTextDocument::blockCount() const;
3QTextBlock QTextDocument::findBlockByNumber(int blockNumber) const;
4QString QTextBlock::text() const;
QPlainTextEdit提供如下方法获取和设置编辑框的只读属性:
xxxxxxxxxx
21bool QPlainTextEdit::isReadOnly() const;
2void QPlainTextEdit::setReadOnly(bool readonly);
QPlainTextEdit提供默认的右键菜单,并为其中的每个菜单项定义了功能完备的槽函数:
xxxxxxxxxx
71void QPlainTextEdit::undo();
2void QPlainTextEdit::redo();
3void QPlainTextEdit::cut();
4void QPlainTextEdit::copy();
5void QPlainTextEdit::paste();
6void QPlainTextEdit::clear();
7void QPlainTextEdit::selectAll();
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为ComboBox的项目。
C:\Users\Minwei\Projects\Qt\ComboBox\ComboBox.qrc:
xxxxxxxxxx
71<RCC>
2 <qresource prefix="/">
3 <file>images/aim.ico</file>
4 <file>images/unit.ico</file>
5 </qresource>
6</RCC>
7
C:\Users\Minwei\Projects\Qt\ComboBox\comboboxdialog.ui:
xxxxxxxxxx
1481
2<ui version="4.0">
3 <class>ComboBoxDialog</class>
4 <widget class="QDialog" name="ComboBoxDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>520</width>
10 <height>320</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>组合框和纯文本编辑框</string>
15 </property>
16 <layout class="QVBoxLayout" name="m_layoutVer">
17 <item>
18 <layout class="QHBoxLayout" name="m_layoutHor">
19 <item>
20 <widget class="QGroupBox" name="m_groupSimple">
21 <property name="title">
22 <string>简单组合框</string>
23 </property>
24 <layout class="QVBoxLayout" name="m_layoutSimpleVer">
25 <item>
26 <layout class="QHBoxLayout" name="m_layoutSimpleHor">
27 <item>
28 <widget class="QPushButton" name="m_btnInit">
29 <property name="text">
30 <string>初始化</string>
31 </property>
32 </widget>
33 </item>
34 <item>
35 <widget class="QPushButton" name="m_btnClear">
36 <property name="text">
37 <string>清空</string>
38 </property>
39 </widget>
40 </item>
41 <item>
42 <widget class="QCheckBox" name="m_checkEditable">
43 <property name="text">
44 <string>可编辑</string>
45 </property>
46 </widget>
47 </item>
48 </layout>
49 </item>
50 <item>
51 <widget class="QComboBox" name="m_comboSimple">
52 <item>
53 <property name="text">
54 <string>初始的表项1</string>
55 </property>
56 <property name="icon">
57 <iconset resource="ComboBox.qrc">
58 <normaloff>:/images/aim.ico</normaloff>:/images/aim.ico</iconset>
59 </property>
60 </item>
61 <item>
62 <property name="text">
63 <string>初始的表项2</string>
64 </property>
65 <property name="icon">
66 <iconset resource="ComboBox.qrc">
67 <normaloff>:/images/aim.ico</normaloff>:/images/aim.ico</iconset>
68 </property>
69 </item>
70 <item>
71 <property name="text">
72 <string>初始的表项3</string>
73 </property>
74 <property name="icon">
75 <iconset resource="ComboBox.qrc">
76 <normaloff>:/images/aim.ico</normaloff>:/images/aim.ico</iconset>
77 </property>
78 </item>
79 </widget>
80 </item>
81 </layout>
82 </widget>
83 </item>
84 <item>
85 <widget class="QGroupBox" name="m_groupUserData">
86 <property name="title">
87 <string>用户数据组合框</string>
88 </property>
89 <layout class="QVBoxLayout" name="m_layoutUserDataVer">
90 <item>
91 <widget class="QPushButton" name="m_btnAdd">
92 <property name="text">
93 <string>添加</string>
94 </property>
95 </widget>
96 </item>
97 <item>
98 <widget class="QComboBox" name="m_comboUserData"/>
99 </item>
100 </layout>
101 </widget>
102 </item>
103 </layout>
104 </item>
105 <item>
106 <widget class="QGroupBox" name="m_groupPlainText">
107 <property name="title">
108 <string>纯文本编辑框</string>
109 </property>
110 <layout class="QVBoxLayout" name="m_layoutPlainTextVer">
111 <item>
112 <layout class="QHBoxLayout" name="m_layoutPlainTextHor">
113 <item>
114 <widget class="QPushButton" name="m_btnAppend">
115 <property name="text">
116 <string>追加</string>
117 </property>
118 </widget>
119 </item>
120 <item>
121 <widget class="QPushButton" name="m_btnErase">
122 <property name="text">
123 <string>擦除</string>
124 </property>
125 </widget>
126 </item>
127 <item>
128 <widget class="QCheckBox" name="m_checkReadOnly">
129 <property name="text">
130 <string>只读</string>
131 </property>
132 </widget>
133 </item>
134 </layout>
135 </item>
136 <item>
137 <widget class="QPlainTextEdit" name="m_plainTextEdit"/>
138 </item>
139 </layout>
140 </widget>
141 </item>
142 </layout>
143 </widget>
144 <resources>
145 <include location="ComboBox.qrc"/>
146 </resources>
147 <connections/>
148</ui>
C:\Users\Minwei\Projects\Qt\ComboBox\comboboxdialog.h:
xxxxxxxxxx
351
2
3
4
5
6QT_BEGIN_NAMESPACE
7namespace Ui { class ComboBoxDialog; }
8QT_END_NAMESPACE
9
10class ComboBoxDialog : public QDialog
11{
12 Q_OBJECT
13
14public:
15 ComboBoxDialog(QWidget *parent = nullptr);
16 ~ComboBoxDialog();
17
18private slots:
19 void on_m_btnInit_clicked();
20 void on_m_btnClear_clicked();
21 void on_m_checkEditable_clicked(bool checked);
22 void on_m_comboSimple_currentIndexChanged(const QString &arg1);
23
24 void on_m_btnAdd_clicked();
25 void on_m_comboUserData_currentIndexChanged(const QString &arg1);
26
27 void on_m_btnAppend_clicked();
28 void on_m_btnErase_clicked();
29 void on_m_checkReadOnly_clicked(bool checked);
30
31private:
32 Ui::ComboBoxDialog *ui;
33};
34
35// COMBOBOXDIALOG_H
C:\Users\Minwei\Projects\Qt\ComboBox\comboboxdialog.cpp:
xxxxxxxxxx
941
2
3
4
5
6ComboBoxDialog::ComboBoxDialog(QWidget *parent)
7 : QDialog(parent)
8 , ui(new Ui::ComboBoxDialog)
9{
10 ui->setupUi(this);
11}
12
13ComboBoxDialog::~ComboBoxDialog()
14{
15 delete ui;
16}
17
18void ComboBoxDialog::on_m_btnInit_clicked()
19{
20 for (int i = 1; i <= 3; ++i)
21 ui->m_comboSimple->addItem(QString::asprintf("无图标表项%d", i));
22
23 for (int i = 1; i <= 3; ++i)
24 ui->m_comboSimple->addItem(QIcon(":/images/unit.ico"),
25 QString::asprintf("有图标表项%d", i));
26
27 QStringList items;
28 items << "整体加表项1" << "整体加表项2" << "整体加表项3";
29 ui->m_comboSimple->addItems(items);
30}
31
32void ComboBoxDialog::on_m_btnClear_clicked()
33{
34 ui->m_comboSimple->clear();
35}
36
37void ComboBoxDialog::on_m_checkEditable_clicked(bool checked)
38{
39 ui->m_comboSimple->setEditable(checked);
40}
41
42void ComboBoxDialog::on_m_comboSimple_currentIndexChanged(const QString &arg1)
43{
44 if (!arg1.isEmpty())
45 ui->m_plainTextEdit->appendPlainText(arg1);
46}
47
48void ComboBoxDialog::on_m_btnAdd_clicked()
49{
50 ui->m_comboUserData->clear();
51
52 QMap<QString, int> cityZone;
53 cityZone["北京"] = 10;
54 cityZone["广州"] = 20;
55 cityZone["上海"] = 21;
56 cityZone["天津"] = 22;
57 cityZone["重庆"] = 23;
58 cityZone["沈阳"] = 24;
59 cityZone["南京"] = 25;
60 cityZone["武汉"] = 27;
61 cityZone["成都"] = 28;
62
63 for (QString const& city : cityZone.keys())
64 ui->m_comboUserData->addItem(city, cityZone[city]);
65}
66
67void ComboBoxDialog::on_m_comboUserData_currentIndexChanged(const QString &arg1)
68{
69 if (!arg1.isEmpty())
70 {
71 QVariant zone = ui->m_comboUserData->currentData();
72 ui->m_plainTextEdit->appendPlainText(arg1 + "的区号:" + zone.toString());
73 }
74}
75
76void ComboBoxDialog::on_m_btnAppend_clicked()
77{
78 QTextDocument* doc = ui->m_plainTextEdit->document();
79 int blockCount = doc->blockCount();
80
81 for(int blockNumber = 0; blockNumber < blockCount; ++blockNumber)
82 ui->m_comboSimple->addItem(QIcon(":/images/aim.ico"),
83 doc->findBlockByNumber(blockNumber).text());
84}
85
86void ComboBoxDialog::on_m_btnErase_clicked()
87{
88 ui->m_plainTextEdit->clear();
89}
90
91void ComboBoxDialog::on_m_checkReadOnly_clicked(bool checked)
92{
93 ui->m_plainTextEdit->setReadOnly(checked);
94}
运行效果如图所示: