本文将为您提供关于qt–使用QGraphicsVideoItem将QGraphicsScene渲染到QImage的详细介绍,同时,我们还将为您提供关于c–QtGUI开发–使用QGraphicsView
本文将为您提供关于qt – 使用QGraphicsVideoItem将QGraphicsScene渲染到QImage的详细介绍,同时,我们还将为您提供关于c – Qt GUI开发 – 使用QGraphicsView显示2D网格、Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)、image – 在Qt中使用OpenGL渲染QGraphicsScene、pyqt5--QGraphicsView的实用信息。
本文目录一览:- qt – 使用QGraphicsVideoItem将QGraphicsScene渲染到QImage
- c – Qt GUI开发 – 使用QGraphicsView显示2D网格
- Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)
- image – 在Qt中使用OpenGL渲染QGraphicsScene
- pyqt5--QGraphicsView
qt – 使用QGraphicsVideoItem将QGraphicsScene渲染到QImage
我想用QGraphicsVideoItem将QGraphicsScene呈现给QImage.当QGraphicsScene只有一个qgraphicstextitem时,一切都有效.但是,如果我用QGraphicsVideoItem替换qgraphicstextitem,则无法获得正确的图像输出.
如何解决这个问题?谢谢…
以下代码用于测试此问题.
#include <QApplication> #include <QGraphicsScene> #include <QMediaPlayer> #include <QGraphicsVideoItem> #include <QImage> #include <QGraphicsView> int main(int argc,char *argv[]) { QApplication a(argc,argv); QGraphicsScene scene; /* part 1. videoItem */ QMediaPlayer* videoPlayer = new QMediaPlayer; QGraphicsVideoItem* screen = new QGraphicsVideoItem; videoPlayer->setVideoOutput(screen); scene.addItem(screen); videoPlayer->setMedia(QUrl::fromLocalFile("./data/Taylor Swift - Blank Space.mp4")); videoPlayer->play(); videoPlayer->setVolume(100); /* part 2. textItem */ /*QGraphicsScene scene; qgraphicstextitem* text = new qgraphicstextitem("aaaaaaa"); scene.addItem(text);*/ QGraphicsView view(&scene); view.resize(1920,1080); view.show(); videoPlayer->pause(); QImage image(1920,1080,QImage::Format_ARGB32); image.fill(Qt::blue); QString pngName = "scene.png"; QPainter painter(&image); painter.setRenderHint(QPainter::Antialiasing); scene.render(&painter); image.save(pngName); return a.exec(); }
在.pro文件中添加以下内容可能会有所帮助:)
QT += core gui QT += core #QT += 3d QT += gui QT += multimedia QT += widgets QT += multimediawidgets
新问题
在我的项目中,我想在QGLView窗口(Qt3D)中渲染视频.但是,QGraphicsView和QGLView似乎无法同时呈现.如果我不使用QGLView的show()方法,我可以获得视频帧.如果我使用QGLView的show()方法,我无法获得正确的帧…
那我怎么能实现上面的想法呢?
解决方法
在实际渲染屏幕后,您可以使用QScreen::grabWindow
(假设Qt 5,在Qt 4中为QPixmap::grabWindow
).要实际拥有任何视频,您需要在视频实际显示时抓取屏幕显示,因此您必须在事件循环运行并且实际显示窗口时执行此操作,例如通过覆盖showEvent或仅使用QTimer.
如果你想要视频和GUI的屏幕截图而不实际显示窗口,我不知道如何去做.
c – Qt GUI开发 – 使用QGraphicsView显示2D网格
我所做的研究使我相信一个QGraphicsView是最好的方法,但我似乎找不到与我需要的教程.如果任何人有任何有关如何实现这一点的提示,将非常感谢.
谢谢,丹
解决方法
// create a scene and add it your view QGraphicsScene* scene = new QGraphicsScene; ui->view->setScene(scene); // Add the vertical lines first,paint them red for (int x=0; x<=500; x+=50) scene->addLine(x,x,500,QPen(Qt::red)); // Now add the horizontal lines,paint them green for (int y=0; y<=500; y+=50) scene->addLine(0,y,QPen(Qt::green)); // Fit the view in the scene's bounding rect ui->view->fitInView(scene->itemsVBoundingRect());
您应该检查QGraphicsView
和QGraphicsScene
文档以及相应的examples.此外,您可以从Qt开发人员日期观看图形视图training videos或某些图形视图related videos.
Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)
总结
以上是小编为你收集整理的Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
image – 在Qt中使用OpenGL渲染QGraphicsScene
QImage imgToSave(1024,768,QImage::Format_ARGB32_Premultiplied); // fill the image // and define rectbuffer(),the QRect() containing what I want to save QPainter painter(&imgToSave); m_scene = new QGraphicsScene; // fill the Scene m_scene->render(&painter,imgToSave.rect(),rectbuffer());
它确实有效.我的问题是:它是否使用OpenGL功能?
如果没有,怎么办?
注: :我正在使用QGLWidget作为我的GraphicsView的视口.使用OpenGL的显示器正在工作.我担心的是图像保存.
解决方法
如果您不能/不会通过QGraphicsView使用QGLWidget,那么您可以渲染到QGLFramebufferObject.但这带来了它自身的复杂性,即你必须事先创造一个隐藏的背景.
pyqt5--QGraphicsView
在Qt界面库中,对于图形的绘制,在前面介绍了一种使用QPainter实现普通二维图形的绘制方法,该方法在paintEvent事件里编写绘图程序,其本质绘制的图形是位图,这种方法更适合于绘制复杂度不高的固定图形,并且不能实现图项的选择、编辑、拖放、修改等交互功能。
对于需要绘制大量的、需要交互的图形,可使用Graphics View绘图架构,它是一种基于图形项(Graphics Item)的模型/视图模式,这种方式可以在一个场景中可绘制大量图元项,且每个图元项都是可选择、可交互的。
在Graphics View绘图架构中,主要涉及到下面三个类的使用:
1. 场景类(QGraphicsScene):该类提供绘图场景(Scene),场景是不可见的,是一个抽象的管理图形项的容器,可向场景中添加图形项,获取场景中的某个图形项等;
2. 视图类(QGraphicsView):该类提供绘图的视图(View)组件,用于显示场景中的内容。可以为一个场景设置几个视图,用于对同一个数据集提供不同的观察方式;
3. 图形项类(QGraphicsItem):该类提供了一些基本的图形元件,也可在此基础上自定义图形项,它支持各种事件的响应,如鼠标事件、键盘事件、拖放事件等,以实现图形的交互功能
在Graphics View绘图架构中涉及到了3个坐标系,即场景坐标、视图坐标及图形项坐标。其中,场景坐标类似于QPainter的逻辑坐标,一般以场景的中心为原点;视图坐标是窗口界面的物理坐标,其左上角为原点坐标;图形项坐标是局部逻辑坐标,通常以图件的中心为原点
坐标实例
import sys
from PyQt5.QtWidgets import QApplication,QGraphicsScene,QGraphicsView,QGraphicsRectItem,QMainWindow,QLabel,QGraphicsItem,QGraphicsEllipseItem
from PyQt5.QtCore import Qt,pyqtSignal,QPoint,QRectF
class QMyGraphicsView(QGraphicsView):
sigMouseMovePoint=pyqtSignal(QPoint)
#自定义信号sigMouseMovePoint,当鼠标移动时,在mouseMoveEvent事件中,将当前的鼠标位置发送出去
#QPoint--传递的是view坐标
def __init__(self,parent=None):
super(QMyGraphicsView,self).__init__(parent)
def mouseMoveEvent(self, evt):
pt=evt.pos() #获取鼠标坐标--view坐标
self.sigMouseMovePoint.emit(pt) #发送鼠标位置
QGraphicsView.mouseMoveEvent(self, evt)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.resize(600,400)
self.view=QMyGraphicsView() #创建视图窗口
self.setCentralWidget(self.view) # 设置中央控件
self.statusbar=self.statusBar() #添加状态栏
self.labviewcorrd=QLabel(''view坐标:'')
self.labviewcorrd.setMinimumWidth(150)
self.statusbar.addWidget(self.labviewcorrd)
self.labscenecorrd=QLabel(''scene坐标:'')
self.labscenecorrd.setMinimumWidth(150)
self.statusbar.addWidget(self.labscenecorrd)
self.labitemcorrd = QLabel(''item坐标:'')
self.labitemcorrd.setMinimumWidth(150)
self.statusbar.addWidget(self.labitemcorrd)
rect=QRectF(-200,-100,400,200)
self.scene=QGraphicsScene(rect) #创建场景
#参数:场景区域
#场景坐标原点默认在场景中心---场景中心位于界面中心
self.view.setScene(self.scene) #给视图窗口设置场景
item1=QGraphicsRectItem(rect) #创建矩形---以场景为坐标
item1.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsFocusable|QGraphicsItem.ItemIsMovable) #给图元设置标志
#QGraphicsItem.ItemIsSelectable---可选择
#QGraphicsItem.ItemIsFocusable---可设置焦点
#QGraphicsItem.ItemIsMovable---可移动
#QGraphicsItem.ItemIsPanel---
self.scene.addItem(item1) #给场景添加图元
for pos,color in zip([rect.left(),0,rect.right()],[Qt.red,Qt.yellow,Qt.blue]):
item=QGraphicsEllipseItem(-50,-50,100,100) #创建椭圆--场景坐标
#参数1 参数2 矩形左上角坐标
#参数3 参数4 矩形的宽和高
item.setPos(pos,0) #给图元设置在场景中的坐标(移动图元)--图元中心坐标
item.setBrush(color) #设置画刷
item.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsFocusable|QGraphicsItem.ItemIsMovable)
self.scene.addItem(item)
self.scene.clearSelection() #【清除选择】
self.view.sigMouseMovePoint.connect(self.slotMouseMovePoint)
def slotMouseMovePoint(self,pt):
self.labviewcorrd.setText(''view坐标:{},{}''.format(pt.x(),pt.y()))
ptscene=self.view.mapToScene(pt) #把view坐标转换为场景坐标
self.labscenecorrd.setText(''scene坐标:{:.0f},{:.0f}''.format(ptscene.x(),ptscene.y()))
item=self.scene.itemAt(ptscene,self.view.transform()) #在场景某点寻找图元--最上面的图元
#返回值:图元地址
#参数1 场景点坐标
#参数2 ????
if item != None:
ptitem=item.mapFromScene(ptscene) #把场景坐标转换为图元坐标
self.labitemcorrd.setText(''item坐标:{:.0f},{:.0f}''.format(ptitem.x(),ptitem.y()))
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
import sys
from PyQt5.QtWidgets import QWidget, QApplication,QGraphicsScene,QGraphicsView
import time
class Example(QWidget):
def __init__(self):
super().__init__()
self.resize(500,400)
scene=QGraphicsScene(self) #创建场景
self.t=scene.addText("Hello, world!") #在场景中添加文本
view=QGraphicsView(scene,self) #创建视图窗口
view.move(10,10)
view.show() #显示
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
添加文本图元
font=QFont("华文琥珀",20,QFont.Bold)
t=scene.addText("Hello, world!",font) #在场景中添加文本图元
#参数1 文本
#参数2 字体
添加矩形
pen = QPen()
pen.setColor(Qt.blue)
pen.setWidth(3)
brush = QBrush(Qt.SolidPattern)
brush.setColor(Qt.yellow)
rect = QRectF(130,130,100,150)
juxin=scene.addRect(30,30,100,100,pen,brush) #添加矩形图元--方式一
#参数1--参数4 坐标和宽高---以View为坐标系
#参数5 画笔
#参数6 画刷
juxin = scene.addRect(rect, pen, brush) # 添加矩形图元--方式二
rect = QRectF(0,0,100,100)
item1 = QGraphicsRectItem(rect) # 创建矩形---以场景为坐标
scene.addItem(item1)
添加线段
pen = QPen()
pen.setColor(Qt.blue)
pen.setWidth(3)
line=scene.addLine(0,0,50,50,pen) #添加直线--方式一
lf=QLineF(50,50,0,50)
line = scene.addLine(lf, pen) #添加直线--方式二
添加椭圆
item = QGraphicsEllipseItem(10, 10, 100, 100) # 创建椭圆--场景坐标
# 参数1 参数2 矩形左上角坐标
# 参数3 参数4 矩形的宽和高
scene.addItem(item)
item=scene.addEllipse(10, 10, 100, 100,pen,brush)
rect=QRectF(10, 10, 100, 100)
item=scene.addEllipse(rect,pen,brush)
图元的操作(缩放,平移,旋转)
想要旋转,平移,缩放窗口中的图元,一般有两种思路:
1. 操作View,概念类似于旋转摄像头,从而获取对场景Scene的不同观察结果,这样操作的好处是,场景中的图元本质上没有发生任何的变化,仅仅改变了View的计算矩阵,效率非常高,并且,如果该Scene被多个View绑定观察,对单独一个view的操作,将不会影响到别的view的观察结果
2.操作Scene中所有的图元Item或者直接操作单个图元Item,概念类似于真实改变了场景中的各个物体的摆放方式,该方法使用的场合位:当一个场景,被多个view观察的时候,场景中的某一个变化操作,需要被这多个view同时观察到
下面是操作图元的方法
1. 图元的缩放:
rect=QRectF(100, 100, 200, 100)
item=scene.addEllipse(rect,pen,brush)
item.setScale(0.5) #对图元进行缩放
#参数为图元大小的缩放比
#需要注意的是,该方法的缩放基准是固定的,也就是说,如果连续两次调用该方法,但是参数的数字一样的话,第二次的调用将不会改变图元的大小
print(item.scale()) #返回图元的缩放比
2.图元的平移
item=scene.addRect(200,200,200,100,pen,brush)
item.setPos(100,50) #移动图元--方式一
#参数 移动的偏移量
#其传参的x与y坐标值,属于场景Scene的坐标,如果调用的时候,坐标来源于view的鼠标点击事件的坐标,需要调用mapToScene()将view坐标值转换到场景坐标
item.moveBy(100,50) #移动图元--方式二
3.图元的旋转
import sys
from PyQt5.QtWidgets import QWidget, QApplication,QGraphicsScene,QGraphicsView,QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsItem,QPushButton
from PyQt5.QtGui import QPen,QBrush
from PyQt5.QtCore import Qt,QRectF,QLineF
class Example(QWidget):
def __init__(self):
super().__init__()
self.resize(500,400)
scene=QGraphicsScene() #创建场景
scene.setSceneRect(0,0,600,500) #设置场景的坐标原点和宽高
pen = QPen()
pen.setColor(Qt.blue)
pen.setWidth(3)
brush=QBrush(Qt.yellow)
item1=scene.addRect(0,0,250,25,pen,brush)
item=scene.addRect(100,100,200,100,pen,brush)
item.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsFocusable | QGraphicsItem.ItemIsMovable)
item.setPos(-100, -100)
item.setTransformOriginPoint(0,0) #设置旋转中心----???不按这点旋转啊
#默认 图元的左上角
#该方法传参的坐标值为图元自身的坐标系
item.setRotation(30) #旋转图元
#参数 角度
#正数 逆时针
#设置的值的基准也是不变的,也就是说,连续两次调用该方法,都传入相同的参数值,图元只会旋转一次
print(item.rotation()) #返回旋转角度
view=QGraphicsView(scene,self) #创建视图窗口
view.resize(500,400)
view.show() #显示
if __name__ == "__main__":
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
天子骄龙
item=QGraphicsEllipseItem(-50,-50,100,100) #创建椭圆--场景坐标
#参数1 参数2 矩形左上角坐标
#参数3 参数4 矩形的宽和高
我们今天的关于qt – 使用QGraphicsVideoItem将QGraphicsScene渲染到QImage的分享就到这里,谢谢您的阅读,如果想了解更多关于c – Qt GUI开发 – 使用QGraphicsView显示2D网格、Difference between drawing with QPainter and (QGraphicsView + QGraphicsScene)、image – 在Qt中使用OpenGL渲染QGraphicsScene、pyqt5--QGraphicsView的相关信息,可以在本站进行搜索。
本文标签: