#include "mainwindow.h"
#include <QPaintEvent>
#include <QPainter>
#include <QPainterPath>
#include <QLinearGradient>
#include <QVector2D>
#include <QTimer>
#include <gl/GLU.h>
#include <QGraphicsPixmapItem>
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent)
: QOpenGLWidget(parent)
{
resize(1080, 720);
QPushButton* btn=new QPushButton(this);
btn->setText("清空/启动");
btn->setGeometry(100,100,100,100);
connect(btn,&QPushButton::clicked,this,[&]()
{
if(calculator->state)
{
//退出线程清空绘图
calculator->killThread();
thread->exit(0);
thread->wait();
path.clear();
pixmap =QPixmap(size());
pixmap.fill(Qt::transparent);
update();
}
else
{
//重启线程
calculator->state=true;
thread->start();
calculator->annotationPath.clear();
calculator->pixmap = QPixmap(1080,720);
calculator->list.clear();
calculator->pixmap.fill (Qt :: transparent);
path.clear();
}
});
this->setWindowFlags(Qt::WindowStaysOnTopHint);
this->setAttribute(Qt::WA_TranslucentBackground);
this->setAttribute(Qt::WA_TransparentForMouseEvents);
thread = new QThread();
// 创建计算对象
calculator = new MyCalculator();
// 将计算对象移动到子线程中
calculator->moveToThread(thread);
// 连接信号和槽
connect(thread, &QThread::started, calculator, &MyCalculator::calculate);
connect(calculator, &MyCalculator::finished, this, &MainWindow::onCalculateFinish,Qt::QueuedConnection);
// 启动子线程
thread->start();
QTimer* m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout()));
m_pTimer->start(30); //50ms定时刷新一次界面
pen.setColor(Qt::transparent);
pen.setWidth(8);
img = QImage(size(), QImage::Format_RGB32);
img.fill(qRgb(255, 255, 255));
pixmap =QPixmap(size());
pixmap.fill(Qt::transparent);
}
void MainWindow::handleTimeout()
{
update();
}
void MainWindow::onCalculateFinish(QPixmap pix)
{
qDebug() << "Main Thread ID2:" << QThread::currentThreadId();
pixmap=pix;
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
path.lineTo(event->pos());
calculator->setPath(path);
}
MainWindow::~MainWindow()
{
qDebug()<<"xigou";
calculator->killThread();
thread->exit(0);
thread->wait(); // wait函数是个阻塞的接口,意思是线程必须真的退出了,才会执行wait之后的语句,否则将会一直阻塞在这里,如果在界面线程上使用,需要保证线程中代码的合理性。
thread = nullptr;
}
void MainWindow::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0, 0, 0, 0);
}
void MainWindow::resizeGL(int width, int height)
{
glViewport(0, 0, width, height);
}
void MainWindow::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
QPainter painter(this);
painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
painter.drawPixmap(0,0,pixmap);
}
QT的实时跟随鼠标绘制彩色线条详细代码
5星 · 超过95%的资源 需积分: 0 133 浏览量
更新于2023-11-22
收藏 7KB ZIP 举报
QT是一个跨平台的应用程序开发框架,广泛用于创建GUI(图形用户界面)应用程序。在这个主题中,"QT的实时跟随鼠标绘制彩色线条详细代码" 涉及到的是使用QT库来实现实时交互的图形绘制功能,特别是追踪鼠标的移动并在屏幕上绘制彩色线条。这个功能在许多领域都有应用,如绘图软件、数据可视化工具等。
我们来看`mainwindow.cpp`,这是QT应用程序中的主窗口类的实现文件。在这个文件中,你可能会看到一个`mouseMoveEvent()`函数,这是QT专门为处理鼠标移动事件而定义的回调函数。当鼠标在窗口内移动时,系统会调用这个函数,你可以在这里获取鼠标的当前位置,并根据这些坐标进行绘制。
接着,`main.cpp`是程序的入口点,它通常包含`int main()`函数,负责初始化QT应用、创建主窗口实例并运行QT的事件循环。在这个文件中,你可能会看到`QApplication`和`MainWindow`的实例化,以及`QApplication::exec()`的调用,这使得程序可以响应用户的输入。
`mainwindow.h`是主窗口类的声明文件,定义了窗口的属性和方法。在这里,你可能会找到`mouseMoveEvent()`函数的声明,以及其他可能用于绘制线条的成员变量,比如用于保存线条颜色和线条宽度的数据结构。
`mainwindow.ui`是使用QT Designer设计的用户界面的XML描述文件。通过QT Designer,你可以直观地布置窗口元素,如按钮、标签等。不过,对于实时跟随鼠标绘制线条的功能,主要的逻辑不在这里,而在对应的`.cpp`和`.h`文件中。
`untitled.pro`是QT项目的构建配置文件,包含了项目编译和链接所需的设置,比如使用的QT模块(例如`QT += widgets`表示使用了GUI模块)、源文件列表等。确保正确配置此文件对于项目的编译至关重要。
`untitled.pro.user`是个人的编译设置,可能包含了一些特定于开发者的编译器选项或者调试配置,但通常不需要直接编辑。
实现这一功能的核心技术包括:
1. **事件处理**:利用QT的事件驱动模型,监听鼠标移动事件。
2. **图形绘制**:使用`QPainter`类进行绘制,它可以方便地在窗口上绘制线条、曲线等图形。
3. **GPU绘制优化**:由于提到了“GPU绘制”,这意味着可能使用了QT的硬件加速特性,通过OpenGL或Vulkan等图形API提升绘制性能。
4. **状态管理**:可能使用了类成员变量来存储当前线条的颜色、粗细等信息,以便在鼠标移动时更新绘制状态。
理解这些知识点,开发者就能创建一个实时响应鼠标移动、动态绘制线条的应用,这对于学习QT的图形编程和事件处理是非常有价值的实践。
秃头的蓝BUFF
- 粉丝: 6
- 资源: 1
最新资源
- chromedriver-linux64_117.0.5878.0.zip
- chromedriver-linux64_117.0.5876.0.zip
- 计算机视觉领域中YOLOV5的Mosaic数据增强原理与应用
- chromedriver-linux64_117.0.5885.0.zip
- chromedriver-linux64_117.0.5883.0.zip
- chromedriver-linux64_117.0.5881.0.zip
- chromedriver-linux64_117.0.5886.0.zip
- chromedriver-linux64_117.0.5888.0.zip
- chromedriver-linux64_117.0.5887.0.zip
- chromedriver-linux64_117.0.5896.0.zip
- chromedriver-linux64_117.0.5897.0.zip
- chromedriver-linux64_117.0.5893.0.zip
- chromedriver-linux64_117.0.5898.0.zip
- chromedriver-linux64_117.0.5899.0.zip
- chromedriver-linux64_117.0.5897.3.zip
- 机械设计半自动灌装包装机step全套技术资料100%好用.zip