qt qlineedit 信号槽_小白初学QT ——信号槽小知识总结

07c84a8e34cbca0113042563384e2d27.png

一 connect方式

1)基本用法

connect(this, SIGNAL(clicked()), this, SLOT(clickMenuSlot()));
connect(exitButton, SIGNAL(clicked()),this, SLOT(ExitClicked()));
connect(ui->buttonBox->button(QDialogButtonBox::Ok),SIGNAL(clicked()), this, SLOT(Remux()));

2)

connect(mixer6, SIGNAL(clicked(bool)),this, SLOT(mixer6Changed(bool)));
connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint &)));

3) 定时器信号

cpuUsageTimer = new QTimer(this);connect(cpuUsageTimer, SIGNAL(timeout()),ui->statusbar, SLOT(UpdateCPUUsage()));cpuUsageTimer->start(3000);

4) 传递给其它对象处理

4.1)

QAction* pAction = new QAction(this);m_menu->addAction(pAction);connect(pAction, SIGNAL(triggered()), m_pObsBasic, SLOT(None()));

4.2)

QObject* parent_=nullptr;// 构造函数中赋值,就可将此窗口信号,传递给父亲窗口处理(QObject *p) :parent_(p)connect(btn_, SIGNAL(clicked()), parent_, SLOT(subCtlClicked()));

5) 自定义信号

实现,按钮点击时,将名字传递给父窗口

signals:void  custom_Signal(QString name);
connect(btn_, SIGNAL(clicked()), this, SLOT(OnGoVideoBtnClicked()));
connect(this, SIGNAL(custom_Signal(QString)), parent_, SLOT(ClickeListItemBtn(QString)));

点击按钮时,触发自定义信号,自定义信息与父窗口槽函数绑定,从而实现了,向父窗口传递信息

OnGoVideoBtnClicked(){emit custom_Signal(courseName_);}

6) 匿名槽函数

auto clickeCutBtn = [this](){};connect(pMainCutBtn, &QPushButton::clicked, clickeCutBtn);

7).省略接收者 默认this处理

connect(ui->actionchooseCourse, SIGNAL(triggered()), SLOT(ChooseCourse()));

二 qt自带的invoke机制调用

这种方式通常用在线程中,而且可以带返回值

一般来说,我们使用invok

eMethod是在子线程需要调度UI操作的时候。

使用 QMetaObject :: invokeMethod 的原因是收件人对象可能在另一个线程中,如果试图直接在另一个线程中的对象上调用一个槽访问或修改非线程安全数据,则会导致损坏或更糟。

 static inline bool invokeMethod(QObject *obj, const char *member,                             QGenericArgument val0 = QGenericArgument(Q_NULLPTR),                             QGenericArgument val1 = QGenericArgument(),                             QGenericArgument val2 = QGenericArgument(),                             QGenericArgument val3 = QGenericArgument(),                             QGenericArgument val4 = QGenericArgument(),                             QGenericArgument val5 = QGenericArgument(),                             QGenericArgument val6 = QGenericArgument(),                             QGenericArgument val7 = QGenericArgument(),                             QGenericArgument val8 = QGenericArgument(),                             QGenericArgument val9 = QGenericArgument())    {        return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,                val1, val2, val3, val4, val5, val6, val7, val8, val9);    }
    static inline bool invokeMethod(QObject *obj, const char *member,                             QGenericReturnArgument ret,                             QGenericArgument val0 = QGenericArgument(Q_NULLPTR),                             QGenericArgument val1 = QGenericArgument(),                             QGenericArgument val2 = QGenericArgument(),                             QGenericArgument val3 = QGenericArgument(),                             QGenericArgument val4 = QGenericArgument(),                             QGenericArgument val5 = QGenericArgument(),                             QGenericArgument val6 = QGenericArgument(),                             QGenericArgument val7 = QGenericArgument(),                             QGenericArgument val8 = QGenericArgument(),                             QGenericArgument val9 = QGenericArgument())    {        return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,                val4, val5, val6, val7, val8, val9);    }

触发obj对象里面的memeber,member是一个信号/槽的名字。

如果正确被触发返回true.调用可以是同步的,也可以是异步的,

具体取决于类型:如果类型为qt::directconnection, 同步 则将立即调用该成员。

如果类型为qt::queuedconnection,异步 则在应用程序进入主事件循环后,将发送qEvent并调用成员。

如果类型为qt::blockingqueuedconnection,则将以与qt::queuedconnection相同的方式调用该方法,但当前线程将阻塞,直到传递事件为止。使用此连接类型在同一线程中的对象之间进行通信将导致死锁。

如果类型为qt::autoconnection,则如果obj与调用方位于同一线程中,则会同步调用该成员;否则,它将异步调用该成员。

成员函数调用的返回值放在ret中。

如果调用是异步的,则无法计算返回值。

QGenericArgument和QGenericReturnArgument是内部帮助程序类。

由于可以动态调用信号和插槽,因此必须使用q_arg()和q_return_arg()宏将参数括起来。

q_arg()接受类型名和该类型的常量引用;

q_return_arg()接受类型名和非常量引用。

示例:

bool bReturn; QMetaObject::invokeMethod(&object, "sig", Qt::DirectConnection/*Qt::QueuedConnection*/, Q_RETURN_ARG(bool, bReturn), Q_ARG(int, i));
QMetaObject::invokeMethod(output->main,"RecordingStop", Q_ARG(int, code));
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值