qt使用emit发射事件信号完整流程

这是一个关于使用Qt框架实现查找对话框的示例。通过声明并连接信号与槽,实现前后查找功能。当用户点击查找按钮时,根据用户设置的选项(匹配大小写和向前/向后查找)发射相应信号,触发查找操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.声明信号

signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs,bool isPre);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs,bool isPre);

2.声明信号槽

private slots:
    //查找信号对应处理函数
    void DoFind(const QString &str,Qt::CaseSensitivity cs,bool isPre);

3.关联信号与信号槽

//关联信号与槽
    connect(this,SIGNAL(findNext(const QString &,Qt::CaseSensitivity,bool)),this,SLOT(DoFind(const QString &,Qt::CaseSensitivity,bool)));
    connect(this,SIGNAL(findPrevious(const QString &,Qt::CaseSensitivity,bool)),this,SLOT(DoFind(const QString &,Qt::CaseSensitivity,bool)));

4.使用emit发射信号

//选中-向前查找
    if (backwardCheckBox->isChecked()) {
        emit findPrevious(text, cs,true);//发射信号,向前查找
    } else {
        emit findNext(text, cs,false);//发射信号,向后查找(默认)
    }

5.演示效果

 完整源码

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>

QT_BEGIN_NAMESPACE
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;
QT_END_NAMESPACE

class FindDialog : public QDialog
{
    Q_OBJECT

public:
    FindDialog(QWidget *parent = 0);

signals:
    void findNext(const QString &str, Qt::CaseSensitivity cs,bool isPre);
    void findPrevious(const QString &str, Qt::CaseSensitivity cs,bool isPre);

private slots:
    void findClicked();
    void enableFindButton(const QString &text);
    //查找信号对应处理函数
    void DoFind(const QString &str,Qt::CaseSensitivity cs,bool isPre);

private:
    QLabel *label;
    QLineEdit *lineEdit;
    QCheckBox *caseCheckBox;
    QCheckBox *backwardCheckBox;
    QPushButton *findButton;
    QPushButton *closeButton;
};

#endif
#include <QtWidgets>

#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
    : QDialog(parent)
{
    label = new QLabel(tr("查找内容:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("匹配大小写"));
    backwardCheckBox = new QCheckBox(tr("向前查找"));

    findButton = new QPushButton(tr("查找"));
    findButton->setDefault(true);
    findButton->setEnabled(false);

    closeButton = new QPushButton(tr("关闭"));

    connect(lineEdit, SIGNAL(textChanged(const QString &)),
            this, SLOT(enableFindButton(const QString &)));
    connect(findButton, SIGNAL(clicked()),
            this, SLOT(findClicked()));
    connect(closeButton, SIGNAL(clicked()),
            this, SLOT(close()));

    //关联信号与槽
    connect(this,SIGNAL(findNext(const QString &,Qt::CaseSensitivity,bool)),this,SLOT(DoFind(const QString &,Qt::CaseSensitivity,bool)));
    connect(this,SIGNAL(findPrevious(const QString &,Qt::CaseSensitivity,bool)),this,SLOT(DoFind(const QString &,Qt::CaseSensitivity,bool)));

    QHBoxLayout *topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("查找演示"));
    setFixedHeight(sizeHint().height());
}

//查找点击事件
void FindDialog::findClicked()
{
    //取得查找文字
    QString text = lineEdit->text();

    //选中-匹配大小写
    Qt::CaseSensitivity cs =
            caseCheckBox->isChecked() ? Qt::CaseSensitive
                                      : Qt::CaseInsensitive;
    //选中-向前查找
    if (backwardCheckBox->isChecked()) {
        emit findPrevious(text, cs,true);//发射信号,向前查找
    } else {
        emit findNext(text, cs,false);//发射信号,向后查找(默认)
    }
}

//根据查找内容显示按钮
void FindDialog::enableFindButton(const QString &text)
{
    findButton->setEnabled(!text.isEmpty());
}

void FindDialog::DoFind(const QString &str, Qt::CaseSensitivity cs,bool isPre)
{
    QString tmp = str;
    //匹配大小写
    if(cs==Qt::CaseSensitive){
        tmp+="-匹配大小写-";
    }

    //向前查找
    if(isPre){
        tmp+="-向前查找-";
    }

    this->setWindowTitle(tmp);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由软件开发者

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值