本文主要测试了Qt对多重继承的支持,以及QThread中多线程的问题。代码示例如下:
//main.h
![]()
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
#include <QThread>
#include <iostream>
#include <cstdio>
#include <QApplication>
![]()
using namespace std;
![]()
class A1 {
public:
virtual void exe() = 0;
};
![]()
class A2 : public A1 {
public:
A2(int a) {a2 = a;}
virtual void exe() {
cout << "I am A2" << endl;
}
private:
int a2;
};
![]()
class A : public QObject , public A2{
Q_OBJECT
public:
A(int a, QObject *parent = 0): A2(a), QObject(parent) {
}
virtual void exe() {
cout << "I am A" << endl;
cout <<"A-Thread: " << QThread::currentThreadId() << endl;
fun();
}
void fun() {
cout <<"A-Func: " << QThread::currentThreadId() << endl;
emit IamSignal();
}
signals:
void IamSignal();
};
![]()
class MyThread : public QThread {
Q_OBJECT
public:
MyThread(QObject *parent = 0):QThread(parent){}
void run() {
myA->exe();
cout << "ThreadID: " << currentThreadId() << endl;
}
void setA(A *a) {
myA = a;
}
public slots:
void IamThreadSlots() {
cout <<"Thread-Solts: " << currentThreadId() << endl;
}
private:
A1 *myA;
};
![]()
![]()
class B : public QObject {
Q_OBJECT
public:
B(QObject *parent = 0): QObject(parent) {}
void set(MyThread *myT, A *aa) {
myThread = myT;
a = aa;
myThread->setA(aa);
connect((A*)a, SIGNAL(IamSignal()), this, SLOT(IamBSlots()));
connect((A*)a, SIGNAL(IamSignal()), myThread, SLOT(IamThreadSlots()));
}
void runB() {
myThread->start();
myThread->wait();
}
public slots:
void IamBSlots() {
cout <<"B-Solts: " << QThread::currentThreadId() << endl;
}
private:
MyThread *myThread;
A1 * a;
};
![]()
#endif // MAIN_H_INCLUDED
![]()
![]()
![]()
![]()
//main.cpp
![]()
#include "main.h"
![]()
int main(int argc, char **argv) {
QApplication app(argc, argv);
MyThread myThread;
A myA(0);
B myB;
cout << "MainThreadID: " << QThread::currentThreadId() << endl;
myB.set(&myThread, &myA);
myB.runB();
return app.exec();
}
运行结果:
MainThreadID: 0xfb8
I am A
A-Thread: 0xd44
A-Func: 0xd44
ThreadID: 0xd44
B-Solts: 0xfb8
Thread-Solts: 0xfb8
结论:
1.Qt支持多重继承。
2.线程中run()函数使用的类对象属于次线程。(如:MyThread中的myA,在run()中执行时,属于次线程)
3.线程中的槽在主线程中执行。(如:MyThread中的IamThreadSlots())












































































































MainThreadID: 0xfb8
I am A
A-Thread: 0xd44
A-Func: 0xd44
ThreadID: 0xd44
B-Solts: 0xfb8
Thread-Solts: 0xfb8
结论:
1.Qt支持多重继承。
2.线程中run()函数使用的类对象属于次线程。(如:MyThread中的myA,在run()中执行时,属于次线程)
3.线程中的槽在主线程中执行。(如:MyThread中的IamThreadSlots())