QT基础(五)----QPainter高级功能

2023-05-16

一 场景和窗口


头文件MyWidget.h


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QGraphicsScene>    //场景
#include<QGraphicsLineItem>     //线的场景
#include<QGraphicsPixmapItem>   //图像的场景

#include<QGraphicsView>         //将场景表现出来
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    QGraphicsScene *_scene;      //data model
    QGraphicsView *_view;       //show data model

signals:

public slots:
};

#endif // MYWIDGET_H

源文件 MyWidget.cpp


#include "MyWidget.h"
#include<QApplication>


MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    _view = new QGraphicsView(this);    //将场景在主窗口界面画出来

    _view->setScene(_scene = new QGraphicsScene);   //将场景设置在该窗口中

    _scene->addItem(new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(100, 100))));   //在创景窗口中画一条直线
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    app.exec();
}

运行结果:


注意:此时画图的场景在主窗口的最左上方的位置,其大小刚好能花开图。

问题:怎样解决该问题使得图像在整个窗口进行展示呢?


思路一:增加一个窗口布局函数,将该场景添加到该布局中


源文件MyWidget.cpp


#include "MyWidget.h"
#include<QApplication>
#include<QVBoxLayout>


MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    QVBoxLayout *vblayout = new QVBoxLayout(this);

    _view = new QGraphicsView(this);    //将场景在主窗口界面画出来

     vblayout->addWidget(_view);

    _view->setScene(_scene = new QGraphicsScene);   //将场景设置在该窗口中



    _scene->addItem(new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(300, 300))));   //在创景窗口中画一条直线
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    app.exec();
}
运行结果:

缺点:放大之后,图像失真,没法判断该线的起始点位置,应该怎么解决呢?


思路二:通过重写虚函数来检查窗口的变化

头文件MyWidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QGraphicsScene>    //场景
#include<QGraphicsLineItem>     //线的场景
#include<QGraphicsPixmapItem>   //图像的场景

#include<QGraphicsView>         //将场景表现出来
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    QGraphicsScene *_scene;      //data model
    QGraphicsView *_view;       //show data model

    //通过检测窗口变大的虚函数
    void resizeEvent(QResizeEvent *);

signals:

public slots:
};

#endif // MYWIDGET_H
源文件MyWidget.cpp
#include "MyWidget.h"
#include<QApplication>

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    _view = new QGraphicsView(this);    //将场景在主窗口界面画出来

    _view->setScene(_scene = new QGraphicsScene);   //将场景设置在该窗口中

    _scene->addItem(new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(300, 300))));   //在创景窗口中画一条直线
}

void MyWidget::resizeEvent(QResizeEvent *)
{
    //set the size of _view = MyWidget::size
    _view->setGeometry(QRect(QPoint(0, 0), size()));    //最后的size()调用的是主窗口的大小
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget w;
    w.show();

    app.exec();
}

运行结果和思路一一致!

二 QPainter高级功能函数

MyWidget.h


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QGraphicsScene>            //场景
#include<QGraphicsLineItem>         //线的场景
#include<QGraphicsPixmapItem>       //图像的场景
#include<QGraphicsTextItem>         //文本图像场景
#include<QGraphicsItemAnimation>    //动画
#include<QTimeLine>
#include<QMouseEvent>
#include<QTimer>                    //创建定时器
//#include<QPrintPreviewDialog>       //打印预览,为什么没有改头文件
//#include<QPrintDialog>              //打印

#include<QGraphicsView>         //将场景表现出来
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);

    QGraphicsScene *_scene;      //data model
    QGraphicsView *_view;       //show data model

    //通过检测窗口变大的虚函数
    void resizeEvent(QResizeEvent *);

    //鼠标点击保存图片
    void mousePressEvent(QMouseEvent *);

    QTimer *_timer;

signals:

public slots:
    void slotTimeOut();
};

#endif // MYWIDGET_H



源文件MyWidget.cpp

#include "MyWidget.h"
#include<QApplication>
#include<QPixmap>  //平台相关的,不建议使用QImage,QBitmapp,QPicture
#include<qDebug>;

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    _view = new QGraphicsView(this);    //将场景在主窗口界面画出来
    _view->setBackgroundBrush(Qt::yellow);//设置背景颜色
    _view->setScene(_scene = new QGraphicsScene);   //将场景设置在该窗口中

    QGraphicsLineItem *line;
    _scene->addItem(line = new QGraphicsLineItem(QLineF(QPointF(0, 0), QPointF(300, 300))));   //在创景窗口中画一条直线
    line->setPen(QPen(Qt::DashDotDotLine));

    QGraphicsTextItem *text;
    _scene->addItem(text = new QGraphicsTextItem("Hello, China!"));
    text->setPos(QPointF(20, 20));      //设置字体的位置
    text->setFont(QFont("宋体", 50, 80, true));   //设置字体的属性

    QGraphicsPixmapItem *_pixmapitem;
    _scene->addItem(_pixmapitem = new QGraphicsPixmapItem(QPixmap("../pic.jpg")));
    _pixmapitem->setPos(QPointF(20, 150));

    //将图动起来
    QGraphicsItemAnimation *animation = new QGraphicsItemAnimation;
    animation->setItem(_pixmapitem);
//    _scene->addItem(animation);

    //怎样动需要QTimeLiness函数
    QTimeLine *timeline = new QTimeLine(3000);      //持续三秒钟
    timeline->setLoopCount(3);                      //设置循环次数

    animation->setTimeLine(timeline);
//    animation->rotationAt(.5);                      //以怎样的角度进行旋转
    animation->setTranslationAt(1, 200, 200);

//    timeline->start();

    _timer = new QTimer();
    _timer->setInterval(1000);       //设置间隔时间
    connect(_timer, SIGNAL(timeout()), this, SLOT(slotTimeOut()));
    _timer->start();
    
    //只打印一次就完了,静态函数
//  QTimer::singleShot(1000, this, SLOT(slotTimeOut());
}

void MyWidget::slotTimeOut()
{
    qDebug()<<"Slot time out";      //每隔一秒钟打印一次
    sender()->deleteLater();        //一会就释放掉该定时,只打印一次
}

void MyWidget::resizeEvent(QResizeEvent *)
{
    //set the size of _view = MyWidget::size
    _view->setGeometry(QRect(QPoint(0, 0), size()));    //最后的size()调用的是主窗口的大小
}

void MyWidget::mousePressEvent(QMouseEvent *ev)
{
#if 0
    //点击鼠标保存图片,所有的类都可以用这种方法进行保存
    if(ev->button() == Qt::LeftButton)
    {
        QPixmap pixmap(size());
        QPainter painter(&pixmap);
        //默认的背景是黑的,怎么设置成白色的呢?
        painter.fillRect(QRectF(0, 0, size().width(), size().height()), Qt::white);
        _scene->render(&painter);
//        _view->render(&painter);
        pixmap.save("../copy.jpg");
        qDebug()<<"pressed!";

    }
#endif
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget w;
    w.showMaximized();

    app.exec();
}





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT基础(五)----QPainter高级功能 的相关文章

  • QT基础(五)----QPainter高级功能

    一 场景和窗口 头文件MyWidget h ifndef MYWIDGET H define MYWIDGET H include lt QWidget gt include lt QGraphicsScene gt 场景 include
  • QPainter 画扇形

    void Widget paintEvent QPaintEvent event QPainter painter this painter setRenderHint QPainter Antialiasing true painter
  • Qt扫盲-Qt Paint System 概述

    Qt Paint System 概述 一 概述 二 绘图设备和后端 1 Widget 2 Image 3 Pixmap 4 OpenGL绘制设备 5 Picture 6 自定义绘制后端 三 绘图与填充 1 Drawing 2 填充 Fill
  • Qt绘图编程-绘制多边形、椭圆、多条直线

    1 说明 所有的绘图操作是在绘图事件中进行 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • 如何用Qt QPainter绘制线性渐变圆弧?

    我正在尝试开发自定义QProgressBar如下图所示 我创建了一个扩展 QProgressBar 的类并实现了 PaintEvent void CircularProgressBar paintEvent QPaintEvent int
  • 使用着色器时,在 QGLWidget 中使用 QPainter 而不是 OpenGL

    许多 Qt 特别是 4 6 用户都会熟悉 OpenGL 教程中提供的 Overpainting 示例 我正在尝试做一些非常相似的事情 但使用纯 OpenGL 数据的着色器 而不是旧的固定功能管道 Set background and sta
  • 如何将 Qline 坐标发送到 QPainter 小部件

    我创建了一个 Qwidget Form temp 它根据父窗口小部件 MainWindow 中创建的数据数组绘制线条 我面临的问题是我通过槽 send data 从 MainWindow 发送到 Form temp 的数据不被 Form t
  • Qt:制作不同颜色的堆叠条形图[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试在 Qt 中制作一个时间线 其中不同的颜色代表不同的任务 最终 它应该看起来有点像这样 但只有一行 现在有人知道如何在不安装额外库的情况下仅使用 QPaint 来做到这一点
  • PaintEvent 中警告 QPainter [重复]

    这个问题在这里已经有答案了 我尝试在 QChartView 中绘制更多信息 因此我重新实现了paintEvent virtual void paintEvent QPaintEvent event QChartView paintEvent
  • 在 PyQt GUI 中集成 QPainter

    我试图在一个布局中使用 QPainter 制作的对象以及 PyQt 的本机小部件 但这样做很困难 我尝试过使用addWidget 将其添加到布局中但没有运气 class window QWidget def init self super
  • Qt 中的自定义圆形进度条[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我可以在覆盖时在 qt 中执行循环进度条paintEvent小部件并绘制圆形进度条 但在主圆形进度条后面的第二个圆形进度条 无法像这样绘制 有困难 有人可以指导我吗 预先感谢 我
  • 使用 QPainter 在 Widget 之间画一条线

    我正在开发一个应用程序 我需要能够在两个之间画一条线QWidget对象 我已经尝试了很多事情 但我目前的尝试 我think方向正确 我只是觉得我错过了一些东西 就是拥有包含的小部件 我称之为DrawWidget并持有QGridLayout认
  • 为什么QPainter::drawPoint画一条水平线段?

    我正在尝试绘制一个 3 像素大点QPainter 但下面的代码却绘制了一条宽度为 3 个像素的水平线 include
  • 如何在PyQt4中用动画画一条线

    我有一个要点清单 例如 points 160 75 115 567 How to draw a line in PyQt4 so it would be something like this 提前致谢 EDIT For the recor
  • 带有 Qt::AlignCenter 的 QPainter 无法正确居中文本

    我想做一个相当简单的绘图 在圆的中心写下两段文字 我的代码 painter gt drawText QRectF 0 0 m iSize m iSize Qt AlignCenter m sAlias n m sCode where m i
  • 自定义 QStyledItemDelegate 以绘制多种颜色的文本

    我想在一个中显示两列QTableWidget显示两次刺痛之间的差异 通过之前的一些编辑距离算法计算 这些部分存储在每个部分的数据中QTableWidgetItem as a QStringList 第一部分必须显示为黑色 接下来的部分必须显
  • Qt 在后台绘制矩形

    我想绘制滑块的背景 我尝试了这个 但颜色覆盖了整个滑块 这是 QSlider 的继承类中的 void paintEvent QPaintEvent e QPainter painter this painter begin this pai
  • QPainterPath 与直线的交点(通过 x 求 QPainterPath y)

    我有 QPainterPath 我需要通过 x 找到 QPainterPath 的 y 坐标 我在 QPainterPath 中找到了 intersected 方法 因此 我创建了新的 QPainterPath 它是具有 x 坐标的从路径边
  • QPainter::drawPixmap() 看起来不好看而且质量低?

    我正在尝试在 a 内绘制一个图标 png QWidget with QPainter drawPixmap QPixmap source png painter setRenderHint QPainter HighQualityAntia
  • QT QGraphics场景绘制圆弧

    我有一个关于在场景上绘制特定弧线的问题 我有关于弧的信息 起始坐标 起始角度 结束角 半径 但我无法有效地使用它们QPainter 其实我尝试过QPainterPath使用形状来显示QGraphicsScene with addPath 但

随机推荐