Quantcast
Channel: C++博客-所有随笔
Viewing all articles
Browse latest Browse all 7882

Qt中关于多重继承以及QThread的测试

$
0
0
本文主要测试了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())


wuxu 2013-04-10 16:10 发表评论

Viewing all articles
Browse latest Browse all 7882

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>