一 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));