#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