版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/81916570
今天有个大佬给我说了这个函数:
[protected] QObject *QObject::sender() const
简直阔怕:
感觉这个函数有点歪门邪道!
这里有个多线程中的警告,Qt::DirectConnection这个直接连接,我记得一般在对象与对象连接的时候才用,多线程中一般都采用Qt::QueuedConnection这种方式把。
下面给出一个简单的例子:
程序运行截图如下:
扫描二维码关注公众号,回复:
2894238 查看本文章
源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
void timerTimeOut();
private:
Ui::Widget *ui;
QTimer *m_timer[3];
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QListWidgetItem>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
for(int i=0;i<3;i++){
m_timer[i]=new QTimer;
connect(m_timer[i],SIGNAL(timeout()),this,SLOT(timerTimeOut()));
}
for(int i=0;i<3;i++){
m_timer[i]->start(1000);
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::timerTimeOut()
{
for(int i=0;i<10;i++){
QListWidgetItem *item=new QListWidgetItem;
item->setText("The object is 0x"+QString::number(uint(m_timer[i]),16));
if(m_timer[i]==QObject::sender()){
if(i==0){
item->setTextColor(Qt::red);
ui->listWidget->insertItem(0,item);
}
else if(i==1){
item->setTextColor(Qt::blue);
ui->listWidget->insertItem(0,item);
}
else{
item->setTextColor(Qt::green);
ui->listWidget->insertItem(0,item);
}
}
}
}