Qt 学习笔记 2. ComboBox
Posted zll_@
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 学习笔记 2. ComboBox相关的知识,希望对你有一定的参考价值。
1.ComboBox
提供的信号
void activated(int index)
void activated(const QString & text)
void currentIndexChanged(int index)
void currentIndexChanged(const QString & text)
void editTextChanged(const QString & text)
void highlighted(int index)
void highlighted(const QString & text)
2.connect()
与 QComboBox
在
Qt
中,可以使用connect()
函数连接QComboBox
控件的信号和槽,实现响应用户操作的交互式功能。
QComboBox
控件中的一些常见信号包括currentIndexChanged
、currentTextChanged
等。可以使用这些信号来响应用户选择一个新项的操作,并根据用户的选择来执行相应的操作。
以下是一个连接
QComboBox
控件信号的示例代码:
#include <QApplication>
#include <QWidget>
#include <QComboBox>
#include <QDebug>
class MyWidget : public QWidget
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr)
: QWidget(parent)
QComboBox *combo_box = new QComboBox(this);
combo_box->addItem("Qt");
combo_box->addItem("Python");
combo_box->addItem("C++");
connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &MyWidget::onComboBoxIndexChanged);
private slots:
void onComboBoxIndexChanged(int index)
qDebug() << "Index changed to " << index;
;
int main(int argc, char *argv[])
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
在这个例子中,首先创建了一个
QComboBox
对象,并向其中添加了三个选项。
然后,使用connect()
函数连接了QComboBox
的currentIndexChanged
信号和一个自定义槽函数onComboBoxIndexChanged()
。
该自定义槽函数根据新的选项索引index
,输出了一条调试信息。
在该程序执行时,每当用户在
QComboBox
中选择了一个新项时,都会触发currentIndexChanged
信号,并调用自定义的槽函数onComboBoxIndexChanged()
。
该自定义槽函数根据新的选项索引,输出相应的调试信息。
需要注意的是,
QComboBox
控件还有其他一些可用的信号,例如activated
、highlighted
等。可以根据具体的需求来选择使用。
同时,需要注意使用connect()
函数连接信号和槽时,需要使用正确的信号和槽的参数类型。
在本例中,我们使用了QOverload<int>::of()
方法来选择使用传递一个整数参数的版本的currentIndexChanged
信号。
2.1例句分析
connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged),this, &MyWidget::onComboBoxIndexChanged);
这段代码使用
Qt
的信号与槽机制,将QComboBox
组件的currentIndexChanged
信号连接到MyWidget
类中的onComboBoxIndexChanged
槽函数,即当QComboBox
组件当前选中项改变时,自动触发onComboBoxIndexChanged
槽函数。
具体分析如下:
connect() 函数原型如下:
bool QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
第一个参数
sender
是发送信号的对象,类型为const QObject *
,在本例中为combo_box
。
第二个参数
signal
是信号的名称,类型为const char *
,在本例中是QComboBox::currentIndexChanged
。
第三个参数
receiver
是接收信号的对象,类型为const QObject *
,在本例中是this
,即MyWidget
类的一个实例。
第四个参数
method
是接收信号的槽函数的名称,类型为const char *
,在本例中是onComboBoxIndexChanged
。
信号
QComboBox::currentIndexChanged
是在选中项改变时发出的,该信号是QComboBox
组件的一个默认信号,由QComboBox
类的currentIndexChanged(int index)
成员函数发出。它通过了一个代表当前选中项的整数索引值。
在
MyWidget
类中,该槽函数onComboBoxIndexChanged
的原型如下:
void MyWidget::onComboBoxIndexChanged(int index);
该槽函数是
MyWidget
类中的一个成员函数,用于处理QComboBox
组件的选中项改变所触发的信号。
因此,这段代码使用
connect()
函数将combo_box
组件的currentIndexChanged()
信号连接到MyWidget
类的onComboBoxIndexChanged
槽函数,当combo_box
组件的选中项改变时,自动触发onComboBoxIndexChanged
槽函数。在onComboBoxIndexChanged
槽函数中,可以通过index
参数获取当前选中项的索引值,并进行相应的处理。
2.1.1将 QComboBox
组件的 currentIndexChanged
信号换成 activated
信号重写一下上面的语句
如果将
QComboBox
组件的信号从currentIndexChanged
换成activated
信号,需要在connect()
函数的第二个参数中将QOverload<int>::of(&QComboBox::currentIndexChanged)
替换成&QComboBox::activated
。具体代码如下:
connect(combo_box, &QComboBox::activated, this, &MyWidget::onComboBoxIndexChanged);
在这段代码中,我们将
combo_box
的activated
信号与MyWidget
的onComboBoxIndexChanged
槽函数连接在一起。activated
信号在用户选择下拉框中一个选项并单击以便选中它时发出,可以获得相应的选项文本。在onComboBoxIndexChanged
槽函数中,可以通过combo_box->currentText()
函数获取当前所选中的文本,并进行相应的处理,代码如下:
void MyWidget::onComboBoxIndexChanged()
QString currentText = combo_box->currentText(); // 获取当前选中项的文本
// 进行相应的处理
需要注意的是,在
activated
信号下,我们不再需要传递一个整数索引值作为参数,直接调用combo_box->currentText()
即可获取当前选中项的文本。
2.2.例句分析
connect(ui->PortBox, &QComboBox::activated, this, (&)[]);
这段代码存在两个错误:
在
connect()
函数中,&
符号是用于获取对象的地址,但放置在(&)
中间是不必要的,我们只需要使用&QComboBox::activated
即可获取QComboBox
组件的activated
信号。
在连接
activated
信号和槽函数时,没有指定要调用的槽函数。(&)[]
语法是Lambda
表达式(匿名函数),但它的参数列表和返回值类型都为空,所以编译器会认为这是一个无效的语法,而导致错误。
因此,正确的语法应该为:
connect(ui->PortBox, QOverload<int>::of(&QComboBox::activated), this, &MyWidget::onPortBoxActivated);
在这段代码中,我们指定了要连接的
QComboBox
组件的activated
信号和this
所指向的MyWidget
类中的onPortBoxActivated
槽函数。在onPortBoxActivated
槽函数中,我们可以通过ui->PortBox->currentIndex()
函数获取当前选中项的整数索引值,并进行相应的处理,代码如下:
void MyWidget::onPortBoxActivated(int index)
// 获取当前选中项的索引值和文本
int currentIndex = ui->PortBox->currentIndex();
QString currentText = ui->PortBox->currentText();
// 进行相应的处理
需要注意的是,使用
QOverload<int>::of(&QComboBox::activated)
时需要包含#include <QOverload>
头文件,该头文件提供了重载函数指针的支持。
Qt学习笔记窗口部件整理
关于Qt中窗口部件的学习
今天开始学习Qt的窗口部件,领略一下Qt的神奇之处,记得2012年的那年冬天,我还学Java呢,现在基本上和Java说再见了,不过对于嵌入式的开发Qt还是举足轻重的,我想趁着假期的时间,好好学习。考研之后发现一个问题,无论当初你学的有多明白,总会忘记,最好的方法就是将他们记录下来,甚至写下你当时的心情,如果有一天你需要了,回过头来看看,是一笔不错的财富。
1. QDialog类对话框
1.1 模态和非模态对话框
对于对话框,有模态(modal)和非模态(modeless)之分。模态对话框就是,对话框一出的时候,你不能点击对话框后面的面板了。非模态就是对话框出的时候,可以点击后面的面板。下面代码就是如何设定的。
1 #include "widget.h" 2 #include "ui_widget.h" 3 #include <QDialog> 4 #include <QDebug> 5 6 Widget::Widget(QWidget *parent) : 7 QWidget(parent), 8 ui(new Ui::Widget) 9 { 10 ui->setupUi(this); 11 // *建立一个QDialog对象,把这个对象设定在这个Widget里面 12 // *这个对象目标建立一个:模态对话框(不能点击其他应用部分) 13 QDialog *dialog1 = new QDialog(this); 14 dialog1->setWindowTitle("DIALOG-1"); 15 // ** 调动dialog的方法,setModal(),给定参数为布尔类型的值 16 // ** 如果是true建立一个模态对话框,如果是false建立一个非模态对话框 17 dialog1->setModal(false); 18 // ** 等效以下方法调动setWindowModality() 19 // ** 给定参数: 20 // ** 1. Qt::ApplicationModal ====> 阻塞整个应用程序(与setModal(true)效果同) 21 // ** 2. Qt::WindowModal ====> 阻塞他的父窗口和祖先窗口和它的子窗口 22 // ** 3. Qt::NonModal ====> 不阻塞任何窗口 23 // dialog1->setWindowModality(Qt::ApplicationModal); 24 25 // *建立一个QDialog对象的另一种方法 26 27 QDialog dialog2(this); 28 dialog2.setWindowTitle("DIALOG-2"); 29 dialog2.exec(); // 和show的区别是,这个需要关闭才能返回 30 // 而变量定义法和指针定义法区别在于,变量定义法会被释放掉。 31 // 如果利用dialog2.show();将会一闪而过! 32 33 dialog1->setWindowModality(Qt::ApplicationModal); 34 dialog1->show(); 35 36 } 37 38 Widget::~Widget() 39 { 40 delete ui; 41 }
以上是关于Qt 学习笔记 2. ComboBox的主要内容,如果未能解决你的问题,请参考以下文章