painter

Qt中在控件上绘图

余生颓废 提交于 2020-10-26 21:24:51
1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上进行绘图的,下面举一个例子。 1 void MainWindow::myDraw(QLabel * label) 2 { 3 QPainter painter(label); 4 painter.setPen(Qt::gray); 5 painter.setBrush(Qt::green); 6 painter.drawRect(10,10,20,20); 7 } 8 9 void MainWindow::paintEvent(QPaintEvent *) 10 { 11 myDraw(ui->label); 12 myDraw(ui->label_2); 13 } 如上所示,重写MainWindow的paintEvent(QPaintEvent *)函数,然后在里面对子控件绘图是没有用的。 2.解决方案 还是以上面的例子为例。 法一 自己定义一个Mylabel类继承于QLabel,然后在这个类中重写paintEvent(QPaintEvent *)函数,并在里面绘图。然后在ui界面中把对应的QLabel提升为Mylabel。这种方式不是很灵活,因此不多介绍,详见https:/

Qt中在控件上绘图

爱⌒轻易说出口 提交于 2020-10-25 17:39:07
1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上进行绘图的,下面举一个例子。 1 void MainWindow::myDraw(QLabel * label) 2 { 3 QPainter painter(label); 4 painter.setPen(Qt::gray); 5 painter.setBrush(Qt::green); 6 painter.drawRect(10,10,20,20); 7 } 8 9 void MainWindow::paintEvent(QPaintEvent *) 10 { 11 myDraw(ui->label); 12 myDraw(ui->label_2); 13 } 如上所示,重写MainWindow的paintEvent(QPaintEvent *)函数,然后在里面对子控件绘图是没有用的。 2.解决方案 还是以上面的例子为例。 法一 自己定义一个Mylabel类继承于QLabel,然后在这个类中重写paintEvent(QPaintEvent *)函数,并在里面绘图。然后在ui界面中把对应的QLabel提升为Mylabel。这种方式不是很灵活,因此不多介绍,详见https:/

QT 图形绘制大全

北战南征 提交于 2020-10-18 03:18:34
1. 绘制图形 protected: void paintEvent(QPaintEvent *); void Widget::paintEvent((QPaintEvent *event) { QPainter painter(this); //this为绘图设备,即表明在该部件上进行绘制 painter.drawLine(QPaint(0, 0), QPaint(100, 100)); } QPainter painter(this); // 会立即开始在设备上绘制,自动调用begin()函数,然后析构函数中调用end()函数结束绘制。 QPainter painter;// 不带参数时,可以在后面调用QPainter::begin(QPaintDevice *device)来指定绘制设置,然后用完再调用end()函数。 等价于 void Widget::paintEvent((QPaintEvent *event) { QPainter painter; painter.begin(this); painter.drawLine(QPaint(0, 0), QPaint(100, 100)); painter.end(); } 2. 使用画刷 画刷可以设置颜色和填充模式 QBrush brush(QColor(0,0,255), Qt::Dense4Pattern);

QT-QT button以及label实现不规则图形(五种方法:使用QSS,设置Mask图片,自己画)

北战南征 提交于 2020-10-05 05:49:51
.h 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include <QWebEngineView> 6 #include " qlayout.h " 7 #include " qpushbutton.h " 8 #include " QMouseEvent " 9 10 QT_BEGIN_NAMESPACE 11 namespace Ui { class MainWindow; } 12 QT_END_NAMESPACE 13 14 class CMyButton; 15 16 class MainWindow : public QMainWindow 17 { 18 Q_OBJECT 19 20 public : 21 MainWindow(QWidget *parent = nullptr); 22 ~ MainWindow(); 23 24 QWebEngineView * view; 25 QHBoxLayout * hl; 26 QPushButton * m_bu; 27 private slots: 28 void on_bu(); 29 private : 30 char * setstr( char * s); 31 private : 32 Ui:

Qt音视频开发22-通用GPU显示

时光毁灭记忆、已成空白 提交于 2020-10-02 16:30:55
一、前言 采用GPU来绘制实时视频一直以来都是个难点,如果是安防行业的做视频监控开发这块的人员,这个坎必须迈过去,本人一直从事的是安防行业的电子围栏这个相当小众的细分市场的开发,视频监控这块仅仅是周边技术玩一玩探讨一下,关于GPU绘制这块着实走了不少的弯路。 之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到GPU使用率有了,但是依然耗时的操作还是在CPU绘制显示,这就显得很尴尬了,Qt封装了大部分的opengl的操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来的yuyv格式的数据显示,还支持硬解码出来的nv12格式的数据显示,很好很强大,这样的话就大大减轻了CPU的压力,专门交给GPU绘制,经过这么一番彻底的改造,效率提升至少5倍,不要太牛逼!如果开启了opengl绘制,则对应内存会增加不少,可能opengl绘制需要开辟很多的内存来交换数据吧。 采用GPU显示需要同时支持yuyv格式和nv12格式,因为有些配置差的电脑,硬解码很可能歇菜,此时就需要用opengl来直接绘制ffmpeg软解码出来的yuyv数据,做到自动切换,这样就兼容了所有的可能的情况。测试发现ffmpeg4的性能要优于ffmpeg3

Qt中在控件上绘图

不想你离开。 提交于 2020-10-02 11:35:26
1.总述 Qt的要在当前类对应的窗口上绘图一般需要重写paintEvent函数,但是Qt的事件过滤器默认是把父窗口下子控件的绘图事件给过滤了的,因此重写父窗口的paintEvent函数是无法在子控件上进行绘图的,下面举一个例子。 1 void MainWindow::myDraw(QLabel * label) 2 { 3 QPainter painter(label); 4 painter.setPen(Qt::gray); 5 painter.setBrush(Qt::green); 6 painter.drawRect(10,10,20,20); 7 } 8 9 void MainWindow::paintEvent(QPaintEvent *) 10 { 11 myDraw(ui->label); 12 myDraw(ui->label_2); 13 } 如上所示,重写MainWindow的paintEvent(QPaintEvent *)函数,然后在里面对子控件绘图是没有用的。 2.解决方案 还是以上面的例子为例。 法一 自己定义一个Mylabel类继承于QLabel,然后在这个类中重写paintEvent(QPaintEvent *)函数,并在里面绘图。然后在ui界面中把对应的QLabel提升为Mylabel。这种方式不是很灵活,因此不多介绍,详见https:/

QT自定义UI组件_图片倒影

只谈情不闲聊 提交于 2020-10-02 10:23:37
实现思想:   两张相同的图片上下对立显示, 上下两张他模糊度不同 示例1 如下图:    代码如下: class ShowWidget : public QWidget { Q_OBJECT public: ShowWidget(QString imgPaht, QWidget *parent = nullptr); ~ShowWidget(); void paintEvent(QPaintEvent *event); void InitWidget(); private: QLabel* m_ImgLab; QLabel* m_InvertedImgLab; QVBoxLayout* m_MainLayout; private: QString m_ImgPath; private: Ui::ShowWidget *ui; };   cpp文件: 用到了QImage中的mirrored(bool, bool), 参数1:是否水平翻转, 参数二: 是否垂直翻转 ShowWidget::ShowWidget(QString imgPath, QWidget *parent) : QWidget(parent), ui(new Ui::ShowWidget) { m_ImgPath = imgPath; InitWidget(); ui->setupUi(this); }

20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)

别来无恙 提交于 2020-08-19 09:55:46
通过 QPainter 绘画实现,以本地图片985*740为例 如下图所示: 效果如下所示: 实现原理 主要通过以下函数实现: void QPainter::drawTiledPixmap ( int x, int y, int w int h const QPixmap & pixmap, int sx = 0 , int sy = 0 );        // 平铺显示pixmap        // x y w h :表示绘画区域        // sx sy :表示Qpixmap绘画起始位置 只要算出x y w h sx sy就能实现超出窗口不显示的效果 举个例子,如下图所示,居中显示 1200*1200 时: 当图片左偏移600时,也就是 offset=-600 时,则只能在窗口上 显示一半 的图片: 代码实现 widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QtGui> class Widget : public QWidget { Q_OBJECT private : QPixmap * pix; int action; // 动作(放大,缩小,移动...) int pixW; // 图片宽 int pixH; // 图片高 QRect Paint; // 绘画区域

Qt QGraphics类应用——图片移动+选点缩放+控制移动区域

泪湿孤枕 提交于 2020-08-18 12:20:05
记录:本博客用来记录学习,引用博客 https://blog.csdn.net/weixin_43935474/article/details/89327314 功能:   1、图片可以使用鼠标进行拖动   2、图片可以在鼠标位置放大缩小   3、图片移动的区域固定 需求:   图片一张 成品: 代码: ImageWidget.h 1 #ifndef IMAGEWIDGET_H 2 #define IMAGEWIDGET_H 3 4 #include <QWidget> 5 #include <QtGui> 6 #include <QPixmap> 7 #include <QPainter> 8 #include <QRectF> 9 #include <QMouseEvent> 10 #include <QPointF> 11 #include <QDragEnterEvent> 12 #include <QGraphicsSceneWheelEvent> 13 #include <QGraphicsItem> 14 15 enum Enum_ZoomState{ 16 NO_STATE, 17 RESET, 18 ZOOM_IN, 19 ZOOM_OUT 20 }; 21 // class ImageWidget :public QObject, QGraphicsItem

Qt开源作品27-鼠标定位十字线

坚强是说给别人听的谎言 提交于 2020-08-16 06:59:53
一、前言 上次有个群友在咨询这个问题,如何用Qt绘制一个鼠标定位的十字线,花了两分钟整了个,最没有含金量的一个demo,就是用drawline绘制了两条线,这个效果在经典的CAD软件中很常用,还有一些股票软件,也有这种十字线定位线,有时候需要在十字交叉地方获取对应点的数据来显示等。Qt来绘制各种效果还是非常方便的,还是那句话:心中有坐标,万物皆painter。 二、代码思路 void Widget::mouseMoveEvent(QMouseEvent *event) { lastPos = event->pos(); update(); } void Widget::mouseReleaseEvent(QMouseEvent *event) { //这里是鼠标按下的坐标,自己存到数据库 lastPos = event->pos(); update(); qDebug() << lastPos; } void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); QPen pen; pen.setWidth(5); pen.setColor(Qt::red); painter.setPen(pen); //绘制横向线 painter.drawLine(0, lastPos.y(), width(), lastPos