Qt应用程序开发七:Qt自定义事件,Qt线程例子

#include <QApplication>
#include"kits/tools.h"
#include"kits/MainWidget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet(ReadStyleFile(":/qss/main.css"));
    MainWidget w;
    w.show();

    return a.exec();
}
#include "Experiment.h"
#include "ui_Experiment.h"
#include"kits/tools.h"
#include<QEvent>
#include<QKeyEvent>
#include<QMouseEvent>

#include<QtConcurrent>


Experiment::Experiment(QWidget *parent) :
    ChildWidget(parent),
    ui(new Ui::Experiment)
{
    ui->setupUi(this);
    _strFiler = new StringFilter(this);
    //安装事件过滤器
    ui->lab_pos->installEventFilter(_strFiler);
    _testThread = new TestThread;
    _curThread = new TestThread(this);
    _thd = new QThread;
    connect(ui->btn_start_thread,SIGNAL(clicked(bool)),_testThread,SLOT(runPrint()));
    _testThread->moveToThread(_thd);
    _thd->start();


}

Experiment::~Experiment()
{
    eDebug;
    delete _testThread;
    _thd->quit();

    if(_future.isRunning()){
        _future.waitForFinished();
        _future.cancel();
    }


    delete ui;
}

bool Experiment::event(QEvent *event)
{

    if(event->type() == TestEvent::EventType){
        TestEvent* testEvent = static_cast<TestEvent* >(event);
        processTestEvent(testEvent);
        if(testEvent->isAccepted())
            return true;
    }else if(event->type() == QEvent::MouseButtonPress){
        QMouseEvent * mEv = reinterpret_cast<QMouseEvent *>(event);
        QString content = QString("x:%1 y:%2").arg(mEv->pos().x()).arg(mEv->pos().y());
        StringEvent sEvent(content);
        qApp->sendEvent(ui->lab_pos,&sEvent);
    }
    return  QWidget::event(event);
}

void Experiment::processTestEvent(TestEvent *event)
{
    eDebug<<"processTestEvent"<<event->name();
    event->accept();
}


void Experiment::on_btn_sendEvent_clicked()
{
//    -阻塞型事件发送
//    需要重写接收对象的event()事件处理函数
//    当事件发送后,将会立即进入event()事件处理函数进行事件处理
//    通过sendEvent() 静态函数实现阻塞发送:
//    sendEvent()函数是阻塞式的,所以支持栈空间/堆空间事件对象的发送(局部对象和new分配的对象)
//    new分配的事件对象被处理后,会由Qt内部自动摧毁

    TestEvent event("sendEvent");
    qApp->sendEvent(this,&event);


//    -非阻塞型事件发送
//    需要重写接收对象的event()事件处理函数
//    当事件发送后立即返回,事件将会发送到事件队列中等待处理
//    通过postEvent()静态函数实现非阻塞发送:
//    postEvent()函数是非阻塞式的,所以只能支持堆空间事件对象的发送(new分配的对象)
//    new分配的事件对象被处理后,会由Qt内部自动摧毁

    TestEvent* pEvent = new TestEvent("postEvent");
    qApp->postEvent(this,pEvent);
}

//控件按键事件
void Experiment::on_btn_Delete_clicked()
{
    int key = Qt::Key_Delete;
    QKeyEvent EventPress(QEvent::KeyPress,key,Qt::NoModifier);
    qApp->sendEvent(ui->textEdit,&EventPress);
    QKeyEvent EventRelase(QEvent::KeyRelease,key,Qt::NoModifier);
    qApp->sendEvent(ui->textEdit,&EventRelase);
}



TestThread::TestThread(QObject *parent):QObject(parent)
{

}

void TestThread::runPrint()
{
    static int m_index = 1;
        eDebug<<"m_index:"<<m_index<<"   "<<QThread::currentThreadId();
        for(int m = 0; m < 10000000000;++m){
//                        eDebug<<m;
        }
    m_index++;
}

void Experiment::on_btn_Concurrent_clicked()
{
    eDebug<<QThread::currentThreadId();
    _future = QtConcurrent::run(_curThread,&TestThread::runPrint);
}
#include "StringFilter.h"
#include"StringEvent.h"
#include<QEvent>
#include<QLabel>

StringFilter::StringFilter(QObject *parent) : QObject(parent)
{

}


bool StringFilter::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type() == StringEvent::EventType){
        QLabel *lab = reinterpret_cast<QLabel*>(watched);
        StringEvent *sEvent = reinterpret_cast<StringEvent*>(event);
        lab->setText(sEvent->str());
        lab->adjustSize();
        sEvent->accept();
        return true;
    }
    return QObject::eventFilter(watched,event);
}
#include "TestEvent.h"

const QEvent::Type TestEvent::EventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+100);

TestEvent::TestEvent(QString eventName):QEvent(EventType),mEventName(eventName)
{

}

QString TestEvent::name()
{
    return mEventName;
}

代码:https://download.csdn.net/download/xzpblog/10964230

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值