Qt 学习笔记 2. ComboBox

1.ComboBox 提供的信号

  1. void activated(int index)
  2. void activated(const QString & text)
  3. void currentIndexChanged(int index)
  4. void currentIndexChanged(const QString & text)
  5. void editTextChanged(const QString & text)
  6. void highlighted(int index)
  7. void highlighted(const QString & text)

2.connect()QComboBox

Qt 中,可以使用 connect() 函数连接 QComboBox 控件的信号和槽,实现响应用户操作的交互式功能。
QComboBox 控件中的一些常见信号包括 currentIndexChangedcurrentTextChanged 等。可以使用这些信号来响应用户选择一个新项的操作,并根据用户的选择来执行相应的操作。

以下是一个连接 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() 函数连接了 QComboBoxcurrentIndexChanged 信号和一个自定义槽函数 onComboBoxIndexChanged()
该自定义槽函数根据新的选项索引 index,输出了一条调试信息。

在该程序执行时,每当用户在 QComboBox 中选择了一个新项时,都会触发 currentIndexChanged 信号,并调用自定义的槽函数 onComboBoxIndexChanged()
该自定义槽函数根据新的选项索引,输出相应的调试信息。

需要注意的是,QComboBox 控件还有其他一些可用的信号,例如 activatedhighlighted 等。可以根据具体的需求来选择使用。
同时,需要注意使用 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_boxactivated 信号与 MyWidgetonComboBoxIndexChanged 槽函数连接在一起。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> 头文件,该头文件提供了重载函数指针的支持。

特点1:美化的并且可自定义的外观 该下拉框使用JS进行渲染。下拉框样式如下: 该外观是由CSS和图片控制。通过修改CSS可以很方便地实现更改外观。 QUI树形下拉框不存在IE6中无法被浮动层遮住等问题。 特点2:使用简单 引入脚本和相应的CSS之后, 在页面写如下的HTML代码: 然后为其指定JSON数据即可。数据格式: var zNodes1 =[ { id:1, pId:0, name:"父节点1",open:true}, { id:11, pId:1, name:"叶子节点11"}, { id:12, pId:1, name:"叶子节点12"}, { id:13, pId:1, name:"叶子节点13"}, { id:2, pId:0, name:"父节点2 ",open:true}, { id:211, pId:2, name:"叶子节点21"}, { id:212, pId:2, name:"叶子节点22"}, { id:213, pId:2, name:"叶子节点23"}, { id:214, pId:2, name:"叶子节点24"} ]; 特点3:控制某些节点不可选 如果希望某些子节点(例如父节点)不可选择,为该项JSON数据设置clickExpand:true即可,这样点击后不会选中项,而是展开子节点。 特点4:触发close事件 可以为selectTree的div添加close事件,每当内容层关闭时会调用。通过这种方式可以将选中项传递给hidden表单元素,用于提交表单。 特点5:自定义图标 下拉框树结构每个节点都可以自定义图标。效果如下: 特点6:宽度处理 QUI树形下拉框对于宽度的处理方式是:默认会有一个宽度,当树结构过宽则内容层会增大宽度用于自适应里面的内容。 还可以为下拉框和内容层强制指定一个宽度。效果如下: 特点7:树形下拉框可编辑 为下拉框代码添加一个editable="true"属性,就把它变成了一个可编辑的下拉框,效果如下: 特点8:可通过AJAX方式加载数据 下拉框的树结构可以通过ajax方式加载。详情请参见在线相关示例。 特点9:变成树形多选下拉框 为下拉框添加multiMode="true"属性,可以把它变成树形多选下拉框。效果如下: 当选择完毕后,鼠标移入可以显示所有选择的选项提示。效果如下: 特点10:树形多选下拉框的不分组模式 改变树形多选下拉框的JSON数据,让其不分组。那么就变成一个select多选下拉框。效果如下: 特点11:树形下拉框的验证 结合QUI框架的验证机制,可以方便地为树形下拉框添加验证。效果如下: 特点12:树形下拉框动态增删改选项 树形下拉框支持动态增删改选项。结合ajax机制可以方便地实现如下效果: 添加一个节点后的效果: 特点13:完美的浏览器兼容性 无论是IE6、IE7、IE8、IE9还是FireFox、Chrome、Safira,甚至在Linux下都保持功能与外观的一致性。 声明:本组件内部的树结构采用的是zTree组件,感谢zTree组件作者的支持与授权。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值