QT之QComboBox详细介绍

此篇文章来源于自己在使用QComboBox类的时候相对其重写而总结的其成员函数知识点,本人能力有限,欢迎大家评论区评论,共同学习

一、QComboBox介绍

QComboBox是Qt GUI库中的一个核心组件,它是一个复合型图形用户界面控件,常用于提供一种紧凑的方式来展示可选项列表。QComboBox通常表现为一个下拉列表框,包含一个文本标签区域和一个下拉箭头按钮,点击箭头时会显示出可供选择的项目列表。

主要特点和功能包括:

  1. 选项展示

    • 可以预先填充一系列固定的选项供用户选择。
    • 选项列表可以动态添加或移除。
  2. 空间优化

    • 当不展开下拉列表时,仅显示当前选定项的文字,占用较少的屏幕空间。
  3. 可编辑性

    • 默认情况下,QComboBox可能不允许用户直接在组合框内编辑文本,但可以通过设置属性使其成为可编辑的,允许用户手动输入文本或者修改现有选项。
  4. 信号与槽机制

    • 提供currentIndexChanged信号,当用户选择不同的选项时发射,可以通过连接这个信号到自定义槽函数来响应用户的操作。信号可以携带整数值(选项索引)或字符串值(选项文本)。
  5. 模型/视图架构

    • 在更高级的使用场景中,QComboBox遵循Qt的模型/视图架构,可以与任何实现了QAbstractItemModel的模型类协同工作,这意味着它可以灵活地绑定不同数据源并自定义显示方式。
  6. 样式定制

    • 可以通过样式表(QSS)进行外观定制,包括但不限于背景色、字体、边框样式等,甚至可以定制下拉列表中每一项(QComboBox的item)的高度,这需要结合C++代码来实现。
  7. 多用途应用

    • 常见的应用场景包括但不限于选择预设选项、切换不同主题模式、选择语言环境等。
#include <QApplication>
#include <QMainWindow>
#include <QComboBox>
#include <QHBoxLayout>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow window;
    window.setWindowTitle("QComboBox Example");

    // 创建一个QComboBox实例
    QComboBox* comboBox = new QComboBox(&window);
    
    // 添加一些项到组合框
    comboBox->addItem("Item 1");
    comboBox->addItem("Item 2");
    comboBox->addItem("Item 3");

    // 设置可访问性名称以提高辅助功能
    comboBox->setAccessibleName("ComboBoxExample");

    // 可选设置自动完成功能
    comboBox->setAutoCompletion(true);

    // 设置模型(如果需要从模型加载数据)
    // QStandardItemModel* model = new QStandardItemModel(comboBox);
    // // 假设填充模型...
    // comboBox->setModel(model);

    // 设置焦点策略
    comboBox->setFocusPolicy(Qt::StrongFocus);

    // 将QComboBox添加到窗口布局中
    QHBoxLayout* layout = new QHBoxLayout;
    layout->addWidget(comboBox);

    QWidget* centralWidget = new QWidget(&window);
    centralWidget->setLayout(layout);
    window.setCentralWidget(centralWidget);

    // 显示主窗口
    window.show();

    return app.exec();
}

上述代码首先包含了必要的Qt头文件,并创建了一个主窗口应用。然后,它构建了一个QComboBox对象并添加了几项进去。同时展示了如何设置可访问性名称、自动完成功能以及焦点策略。最后,将QComboBox放入一个布局中,并将其作为中心部件添加到主窗口中。

请注意,如果你是在实际项目中使用QComboBox,可能还需要处理信号槽连接,比如当用户选择下拉框中的某一项时执行特定动作。此外,如果要动态地从模型加载数据,则会使用setModel()方法来替换手动添加项的方式。

二、成员函数

1、Q ComboBox::QComboBox(QWidget *parent = nullptr)

ComboBox::QComboBox(QWidget *parent = nullptr) 是Qt框架中的QComboBox类的一个构造函数,该类主要用于创建一个下拉列表框,用户可以从其中选择一项。

这个构造函数用于初始化一个新的QComboBox类实例,并可选地指定其父级窗口。参数parent是一个指向QWidget对象的指针。如果传入一个父窗口,新创建的组合框将成为该父窗口的子组件,这会影响到以下几个方面:

  1. 生命周期管理:如果父窗口被销毁,其所有子组件也会随之自动销毁。因此,如果你为QComboBox设置了父窗口,在父窗口被删除时,它也会被一同删除。

  2. 窗口布局:子组件默认相对于其父窗口定位,并共享相同的窗口系统资源。

  3. 样式继承:组件会从其父窗口继承样式设置。例如,若父窗口具有某种背景颜色或字体,子组件(此处是QComboBox)也将具有相同的样式,除非明确覆盖。

若传入nullptr(这是默认值),则QComboBox将变为顶级窗口,不具有父窗口。

总结来说,这个构造函数用于创建一个新的QComboBox对象,并可以选择性地将其附加到应用程序GUI层级中的某个父窗口上。

#include <QApplication>
#include <QComboBox>
#include <QMainWindow>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow mainWindow;
    mainWindow.setWindowTitle("ComboBox Example");

    // 创建一个QComboBox,并设置mainwindow为其父窗口
    QComboBox* comboBox = new QComboBox(&mainWindow);
    // 添加一些选项
    comboBox->addItem("Option 1");
    comboBox->addItem("Option 2");
    comboBox->addItem("Option 3");

    // 将QComboBox添加到主窗口的中央区域
    mainWindow.setCentralWidget(comboBox);

    mainWindow.show();

    return app.exec();
}

在这段代码中,我们首先创建了一个QMainWindow对象mainWindow作为父窗口。然后通过new QComboBox(&mainWindow)创建了一个QComboBox对象,并将其父窗口设置为mainWindow。接着向组合框中添加了一些选项,并将其设为主窗口的中心部件显示出来。最后运行Qt事件循环以展示和处理用户交互。

2、void QComboBox::activated(int index)

void QComboBox::activated(int index) 是Qt库中 QComboBox 类的一个信号。当用户在下拉列表中选择了一个项,且该控件当前处于非editable模式时,此信号会被发射。

信号参数 index 表示用户所选项目的索引,从0开始计数。例如,如果用户选择了下拉列表中的第一个项目,则 index 的值为0;如果是第二个项目,则为1,以此类推。

你可以在你的代码中连接这个信号到一个槽(slot),以便在用户作出选择时执行特定的操作。示例代码如下:

connect(ui->comboBox, &QComboBox::activated, this, &YourClass::onComboBoxActivated);

// 在YourClass中定义对应的槽函数
void YourClass::onComboBoxActivated(int index)
{
    switch (index) {
    case 0:
        // 处理用户选择了第0个选项的情况
        break;
    case 1:
        // 处理用户选择了第1个选项的情况
        break;
    // 其他选项的处理...
    }
}

在这个例子中,每当用户在下拉列表中做出新的选择时,就会调用YourClass类中的onComboBoxActivated槽函数,并传入用户选择的项的索引。

3、void QComboBox::clear()

void QComboBox::clear() 是Qt库中 QComboBox 类的一个成员函数。当你调用这个函数时,它将会清除组合框(QComboBox)中的所有项目,即删除所有的选项。

具体而言,这意味着下拉列表将变得空无一物,用户无法从中进行任何选择。如果之前有与组合框选项关联的数据或者状态,它们通常也会随着选项的清除而被移除或重置。

示例代码:

QComboBox *comboBox = new QComboBox(this);
comboBox->addItem("Item 1");
comboBox->addItem("Item 2");
comboBox->addItem("Item 3");

// 清除所有选项
comboBox->clear();

在上述代码中,我们首先创建了一个包含三个选项的QComboBox对象。然后调用 clear() 函数后,这个组合框内的所有选项"Item 1"、"Item 2"和"Item 3"都会被清除。

4、void QComboBox::clearEditText()

void QComboBox::clearEditText() 是Qt库中 QComboBox 类的一个成员函数。当调用这个函数时,它会清除组合框(QComboBox)当前显示的编辑文本内容,仅适用于可以编辑的组合框。

在允许用户编辑的QComboBox中,除了下拉列表中的预设选项外,用户还可以直接在组合框内输入文本。调用 clearEditText() 会将用户输入的这部分文本清空,但不会影响下拉列表中的原有选项。

示例代码:

QComboBox *comboBox = new QComboBox(this);
comboBox->setEditable(true); // 允许编辑

// 假设用户已输入了自定义文本
// ...
comboBox->clearEditText(); // 清除用户输入的文本

在这个例子中,我们首先创建了一个可编辑的QComboBox,然后假设用户已经输入了一些文本。调用 clearEditText() 后,组合框内用户手动输入的所有文本都将被清除。

5、void QComboBox::currentIndexChanged(int index)

void QComboBox::currentIndexChanged(int index) 是Qt库中 QComboBox 类的一个信号。当用户在下拉列表中选择了一个不同的项,导致当前选中的项发生变化时,这个信号就会发出。

信号参数 index 是新选中项的索引,从0开始计数。例如,如果用户原来选择的是索引为1的项,现在改为选择索引为2的项,那么 currentIndexChanged 信号就会发射,并传递参数2。

你可以通过 QObject::connect 函数将这个信号连接到一个槽函数,以便在用户改变选择时执行相应的操作。下面是一个简单的示例:

connect(comboBox, &QComboBox::currentIndexChanged, this, &YourClass::onComboBoxIndexChanged);

// 在YourClass中定义对应的槽函数
void YourClass::onComboBoxIndexChanged(int index)
{
    switch (index) {
    case 0:
        // 处理用户选择了第0个选项的情况
        break;
    case 1:
        // 处理用户选择了第1个选项的情况
        break;
    // 其他选项的处理...
    }
}

这样,每当QComboBox的当前选中项发生改变时,就会调用YourClass类中的onComboBoxIndexChanged槽函数,并将新选中的项的索引作为参数传递给槽函数。

6、void QComboBox::currentTextChanged(const QString &text)

void QComboBox::currentTextChanged(const QString &text) 是Qt库中 QComboBox 类的一个信号。当组合框(QComboBox)当前显示的文本发生改变时(包括但不限于用户在可编辑的组合框中直接修改文本或者通过下拉列表选择其他项导致的文本变化),这个信号会被发射。

信号参数 text 是组合框当前显示的新文本内容。

你可以在程序中通过 QObject::connect 函数连接这个信号到一个槽函数,以便在当前显示的文本改变时执行特定操作。以下是一个简单的示例:

connect(comboBox, &QComboBox::currentTextChanged, this, &YourClass::onCurrentTextChanged);

// 在YourClass类中定义对应的槽函数
void YourClass::onCurrentTextChanged(const QString &text)
{
    qDebug() << "当前选中的文本已变为:" << text;
    // 根据text执行其他相关操作...
}

在这个示例中,每当QComboBox的当前显示文本发生变化时,就会调用YourClass类中的onCurrentTextChanged槽函数,并将新的文本内容作为字符串参数传递给槽函数。

7、void QComboBox::editTextChanged(const QString &text)

void QComboBox::editTextChanged(const QString &text) 是Qt库中 QComboBox 类的一个信号。当用户在一个可编辑的QComboBox中更改文本时,即使该文本并不对应于下拉列表中的任何现有选项,这个信号也会被触发。

信号参数 text 是组合框中编辑框内的当前文本内容。如果你允许用户在组合框中自由输入文本,那么每当这个输入的文本发生变化时,editTextChanged 信号就会发出,并将新文本内容作为字符串参数传递。

使用示例:

connect(comboBox, &QComboBox::editTextChanged, this, &YourClass::onEditTextChanged);

// 在YourClass类中定义对应的槽函数
void YourClass::onEditTextChanged(const QString &text)
{
    qDebug() << "编辑框中的文本已变为:" << text;
    // 根据text执行其他相关操作...
}

在这个示例中,每当QComboBox的编辑框内文本发生变化时,无论该文本是否与下拉列表中的选项匹配,都会调用YourClass类中的onEditTextChanged槽函数,并将新的文本内容作为参数传递给槽函数。

8、void QComboBox::highlighted(int index)

void QComboBox::highlighted(int index) 是Qt库中 QComboBox 类的一个信号。当用户在下拉列表中滚动鼠标或者使用键盘上下箭头高亮显示一个选项,但尚未正式选择该选项(即未触发currentIndexChanged信号)时,这个信号会被发射。

信号参数 index 是当前被高亮显示的选项的索引,从0开始计数。

使用示例:

connect(comboBox, &QComboBox::highlighted, this, &YourClass::onComboBoxHighlighted);

// 在YourClass类中定义对应的槽函数
void YourClass::onComboBoxHighlighted(int index)
{
    qDebug() << "当前高亮显示的选项索引为:" << index;
    // 根据index执行其他相关操作,比如预览该选项的相关信息等...
}

在这个示例中,每当QComboBox中的某个选项被用户高亮显示时,就会调用YourClass类中的onComboBoxHighlighted槽函数,并将当前高亮选项的索引作为参数传递给槽函数。

9、void QComboBox::setEditText(const QString &text)

void QComboBox::setEditText(const QString &text) 是Qt库中 QComboBox 类的一个成员函数。当组合框(QComboBox)是可编辑的,调用这个函数可以设置组合框中编辑框的当前显示文本。如果提供的文本值与下拉列表中的某个选项匹配,则组合框会选择该选项并显示其文本;如果不匹配,则仅仅在编辑框中显示提供的文本。

使用示例:

QComboBox *comboBox = new QComboBox(this);
comboBox->setEditable(true); // 允许编辑

comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
comboBox->addItem("Custom Text"); // 假设自定义文本不存在于下拉列表中

comboBox->setEditText("Custom Text"); // 如果“Custom Text”不在下拉列表中,则会在编辑框中显示此文本

在这个示例中,我们首先创建了一个可编辑的QComboBox,并添加了几个选项。然后尝试通过 setEditText 设置一个可能并不在下拉列表中存在的文本。在这种情况下,编辑框将直接显示“Custom Text”,而不是从下拉列表中选择一个匹配项。如果“Custom Text”存在于下拉列表中,则组合框会显示出该选项并且其当前索引会相应更新。

10、void QComboBox::textActivated(const QString &text)

void QComboBox::textActivated(const QString &text) 是Qt库中 QComboBox 类的一个信号。当用户在可编辑的QComboBox中输入文本并按下回车键激活,或者当用户从下拉列表中选择了一个选项且该选项的文本与当前编辑框中的文本相同时,此信号会被发射。

信号参数 text 是被激活的文本内容,即用户实际选择或输入的文字。

这个信号常用于在用户通过按下回车键确认其在组合框中输入的内容或者选择了一个与编辑框中内容相匹配的选项时执行相应的操作。

使用示例:

connect(comboBox, &QComboBox::textActivated, this, &YourClass::onTextActivated);

// 在YourClass类中定义对应的槽函数
void YourClass::onTextActivated(const QString &text)
{
    qDebug() << "激活的文本为:" << text;
    // 根据text执行其他相关操作...
}

在这个示例中,当用户通过按回车键激活QComboBox中的文本或者选择了一个与当前编辑框文本一致的选项时,YourClass类中的onTextActivated槽函数会被调用,并将激活的文本内容作为参数传递给槽函数。

11、void QComboBox::textHighlighted(const QString &text)

void QComboBox::textHighlighted(const QString &text) 是Qt库中 QComboBox 类从5.14版本开始引入的一个信号。当用户在下拉列表中高亮显示某个选项时,该信号会被触发,并将被高亮选项的文本内容作为参数传递。

使用示例:

connect(comboBox, &QComboBox::textHighlighted, this, &YourClass::onTextHighlighted);

// 在YourClass类中定义对应的槽函数
void YourClass::onTextHighlighted(const QString &text)
{
    qDebug() << "用户高亮显示的选项文本为:" << text;
    // 根据text执行其他相关操作,如预览高亮选项的信息等...
}

在此示例中,当用户在QComboBox的下拉列表中滚动鼠标或使用键盘高亮显示某个选项时,YourClass类中的onTextHighlighted槽函数会被调用,并将高亮选项的文本内容作为字符串参数传递给槽函数。这个信号主要用于在用户还未正式选择(点击或按回车键)高亮选项时,就对用户的浏览行为进行响应。

12、QComboBox::~QComboBox()

QComboBox::~QComboBox() 是Qt库中 QComboBox 类的析构函数。当一个 QComboBox 对象的生命期结束,即将被销毁时,C++的运行时环境会自动调用这个析构函数。

析构函数的主要作用是对对象占用的系统资源进行释放和清理工作,例如删除组合框内部维护的所有选项数据、断开与其他对象的连接、释放内存等。在Qt中,由于采用了智能指针和内存管理机制,许多基础资源管理工作已经由Qt框架自动完成,但对于自定义分配的资源,开发者仍需在析构函数中确保正确释放。

由于析构函数是由系统自动调用的,所以开发人员一般不需要也不应该显式调用析构函数。在实际编程过程中,只需要关注如何合理创建和使用 QComboBox 对象即可,Qt框架会负责在合适的时间调用析构函数来清理不再使用的对象。

13、void QComboBox::addItem(const QString &text, const QVariant &userD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值