精华内容
下载资源
问答
  • I tried to draw some more information in QChartView so I re-implement paintEventvirtual void paintEvent(QPaintEvent *event) {QChartView::paintEvent(event);OmenChart *mchr = dynamic_cast(this->chart...

    I tried to draw some more information in QChartView so I re-implement paintEvent

    virtual void paintEvent(QPaintEvent *event) {

    QChartView::paintEvent(event);

    OmenChart *mchr = dynamic_cast(this->chart());

    if(mchr == nullptr)

    return;

    QPainter painter(this);

    const int labelOffset = 2 + 2;

    painter.setFont(this->font());

    painter.setPen(QPen(Qt::black));

    QFontMetrics fm(painter.font());

    const OmenScatterSeries *omnSr = mchr->serie();

    QVector points = omnSr->pointsVector();

    QStringList labels = omnSr->pointLabels();

    for (int i(0); i < labels.count(); i++) {

    QString pointLabel = labels[i];

    // Position text in relation to the point

    int pointLabelWidth = fm.width(pointLabel);

    QPointF position(points.at(i));

    position.setX(position.x() - pointLabelWidth / 2);

    position.setY(position.y() - labelOffset);

    painter.drawText(position, pointLabel);

    }

    }

    and I am taking these errors

    QWidget::paintEngine: Should no longer be called

    QPainter::begin: Paint device returned engine == 0, type: 1

    QPainter::setFont: Painter not active

    QPainter::setPen: Painter not active

    QPainter::font: Painter not active

    QWidget::paintEngine: Should no longer be called

    Any ideas on this ? I had also used painter.begin and end but I took the same errors

    解决方案

    Do not draw on your subclass of QChartView, but instead on its viewport.

    QChartView is derived from QGraphicsView, which in turn is derived from QAbstractScrollArea and according to this answer (as well as the cited there documentation) you should use the viewport as a paint device for your QPainter, not the widget itself.

    So, instead of

    QPainter painter(this);

    write

    QPainter painter(viewport());

    The same could be seen in the source of QGraphicsView, i.e.:

    // Set up the painter

    QPainter painter(viewport());

    展开全文
  • 主要通过重写paintEvent、mousePressEvent、mouseMoveEvent,根据鼠标点击和移动绘制线段,并可以计算所有绘制的线段的长度。
  • Qt paintevent事件

    2017-11-10 13:54:25
    Qt paintevent事件 一.主要理解一下几个方法和属性: 1.QWidget * QScrollView::viewport () const 2.void QWidget::paintEvent ( QPaintEvent * ) [虚 保护] 3.void QWidget::repaint ( int x

    Qt paintevent事件

    一.主要理解一下几个方法和属性:

    1.QWidget * QScrollView::viewport () const

    2.void QWidget::paintEvent ( QPaintEvent * ) [虚 保护]

    3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]

    4.void QWidget::update () [槽]

    5.void QWidget::erase ( int x, int y, int w, int h )

    6.bool updatesEnabled

    二.现分别详细介绍:

    1.QWidget * QScrollView::viewport () const

    返回滚动视图中的视口窗口部件,这个窗口部件包含内容窗口部件或者要画的区域。

    2.void QWidget::paintEvent ( QPaintEvent * ) [虚 保护]

    只要窗口部件需要被重绘就被调用。每个要显示输出的窗口部件必须实现它。这个事件处理器可以在子类中被重新实现来接收绘制事件。 它可以是repaint()或update()的结果。 很多窗口部件在当它们被请求时,它们很简单地重新绘制整个界面,但是一些窗口部件通过仅仅绘制被请求的区域QPaintEvent::region()进 行优化,例如,QListView和QCanvas就是这样做的。

    Qt也可通过把多个绘制事件合并为一个来加快绘制速度。当update()被调用几次或者窗口系统发送几次绘制事件,Qt把它们合并为 一个比较大区域(请参考QRegion::unite())的一个事件中。repaint()不允许这样优化,所以只要可能我们尽量使用update ()。

    当绘制事件发生,更新区域通常被擦除。这里有一些例外,通过QPaintEvent::erased()可以得知这个窗口部件是否被擦除。

    3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]

    通过立即调用paintEvent()来直接重新绘制窗口部件,如果erase为真,Qt在paintEvent()调用之前擦除区域 (x,y,w,h)。 如果w是负数,它被width()-x替换,并且如果h是负数,它被height()-y替换。 如果你需要立即重新绘制,建议使用repaint(),比如在动画期间。在绝大多数情况下,update()更好,因为它允许Qt来优化速度并且防止闪 烁。 警告:如果你在一个函数中调用repaint(),而它自己又被paintEvent()调用,你也许会看到无线循环。update()函数从来不会产生 循环。

    4.void QWidget::update () [槽]

    更新窗口部件,当Qt回到主事件中时,它规划了所要处理的绘制事件。这样允许Qt进行优化从而得到比调用repaint()更快的速度和更 少的闪烁。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的区域,仅仅只有在WRepaintNoErase窗口部件标记被设置的时候才不会。

    5.void QWidget::erase ( int x, int y, int w, int h )

    在窗口部件中擦除指定区域(x, y, w, h),并不产生绘制事件。

    如果w为负数,它被width()-x替换。如果h为负数,它被height()-y替换。

    子窗口部件不被影响。

    6.bool updatesEnabled

    这个属性保存的是更新是否生效。

    如果更新失效,调用update()和repaint()是没有效果的。如果更新失效,来自窗口系统的绘制事件会被正常处理。 setUpdatesEnabled()通常被用于在一小段事件内使更新失效,例如为了避免在大的变化期间发生屏幕闪烁。

    实例:

        setUpdatesEnabled( FALSE );

        bigVisualChanges();

        setUpdatesEnabled( TRUE );

        repaint();

    通过setUpdatesEnabled()设置属性值并且通过isUpdatesEnabled()来获得属性值。

    展开全文
  • QImage QPixmap paintEvent

    2020-05-16 13:45:28
    1、paintEvent,顺序有影响 def paintEvent(self, event): painter = QtGui.QPainter(self) painter.fillRect(0, 0, self.width(), self.height(), self.background_color) painter.drawPixmap(self.rect(), ...

    1、paintEvent,顺序有影响

        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.fillRect(0, 0, self.width(), self.height(), self.background_color)
            painter.drawPixmap(self.rect(), self.pixmap)
    

    2、及时刷新:self.update()

        def set_background_color(self, color):
            self.background_color = color
            self.update()
    
    # -*- coding: utf-8 -*-
    """
    Author: administrator
    Date: 2020/5/16 11:52
    """
    
    from PySide2 import QtCore
    from PySide2 import QtWidgets
    from PySide2 import QtGui
    from shiboken2 import wrapInstance
    
    import maya.OpenMayaUI as omui
    import maya.OpenMaya as om
    import maya.cmds as cmds
    import maya.mel as mel
    
    
    def maya_main_window():
        """
        Return the Maya main window widget as a Python object
        """
        main_window_ptr = omui.MQtUtil.mainWindow()
        return wrapInstance(long(main_window_ptr), QtWidgets.QWidget)
    
    class CustomImageWidget(QtWidgets.QWidget):
        def __init__(self, width, height, image_path, parent=None):
            super(CustomImageWidget, self).__init__(parent)
    
            self.set_size(width, height)
            self.set_image(image_path)
            self.set_background_color(QtCore.Qt.black)
    
        def set_size(self, width, height):
            self.setFixedSize(width, height)
    
        def set_image(self, image_path):
            image = QtGui.QImage(image_path)
            image = image.scaled(self.width(), self.height(), QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation)
    
            self.pixmap = QtGui.QPixmap()
            self.pixmap.convertFromImage(image)
    
        def set_background_color(self, color):
            self.background_color = color
            self.update()
    
        def paintEvent(self, event):
            painter = QtGui.QPainter(self)
            painter.fillRect(0, 0, self.width(), self.height(), self.background_color)
            painter.drawPixmap(self.rect(), self.pixmap)
    
    class OpenImportDialog(QtWidgets.QDialog):
        WINDOW_TITLE = "Open/Import/Reference"
        FILE_FILTERS = "Maya (*.ma *.mb);;Maya ASCII (*.ma);;Maya Binary (*.mb);;All Files(*.*)"
    
        selected_filter = "Maya (*.ma *.mb)"
    
        def __init__(self, parent=maya_main_window()):
            super(OpenImportDialog, self).__init__(parent)
    
            self.setWindowTitle(self.WINDOW_TITLE)
            self.setMinimumSize(300, 80)
            self.setWindowFlags(self.windowFlags() ^ QtCore.Qt.WindowContextHelpButtonHint)
    
            self.create_widgets()
            self.create_title_label()
            self.create_layout()
            self.create_connections()
    
        def create_widgets(self):
            self.filePath_le = QtWidgets.QLineEdit()
            self.select_file_path_btn = QtWidgets.QPushButton()
            self.select_file_path_btn.setIcon(QtGui.QIcon(":fileOpen.png"))
            self.select_file_path_btn.setToolTip("Select File")
            self.select_file_path_btn.setFlat(True)
    
            self.open_rb = QtWidgets.QRadioButton("Open")
            self.open_rb.setChecked(True)
            self.import_rb = QtWidgets.QRadioButton("Import")
            self.reference_rb = QtWidgets.QRadioButton("Reference")
    
            self.force_cb = QtWidgets.QCheckBox("Force")
    
            self.green_bttn = QtWidgets.QPushButton("Green")
            self.apply_bttn = QtWidgets.QPushButton("Apply")
            self.close_bttn = QtWidgets.QPushButton("Close")
    
        def create_title_label(self):
            image_path = "D:/Workspace/PyCharm/PySide2 for Maya/image.png"
    
            self.title_label = CustomImageWidget(280, 70, image_path)
            self.title_label.set_background_color(QtCore.Qt.red)
    
        def create_layout(self):
            file_path_layout = QtWidgets.QHBoxLayout()
            file_path_layout.addWidget(self.filePath_le)
            file_path_layout.addWidget(self.select_file_path_btn)
    
            radio_bttn_layout = QtWidgets.QHBoxLayout()
            radio_bttn_layout.addWidget(self.open_rb)
            radio_bttn_layout.addWidget(self.import_rb)
            radio_bttn_layout.addWidget(self.reference_rb)
    
            form_layout = QtWidgets.QFormLayout()
            form_layout.addRow("File", file_path_layout)
            form_layout.addRow("", radio_bttn_layout)
            form_layout.addRow("", self.force_cb)
    
            bttn_layout = QtWidgets.QHBoxLayout()
            bttn_layout.addWidget(self.green_bttn)
            bttn_layout.addStretch()
            bttn_layout.addWidget(self.apply_bttn)
            bttn_layout.addWidget(self.close_bttn)
    
            main_layout = QtWidgets.QVBoxLayout(self)
            main_layout.setContentsMargins(5, 5, 5, 5)
            main_layout.addWidget(self.title_label)
            main_layout.addLayout(form_layout)
            main_layout.addLayout(bttn_layout)
    
        def create_connections(self):
            self.select_file_path_btn.clicked.connect(self.show_file_select_dialog)
            self.open_rb.toggled.connect(self.update_force_visibility)
    
            self.green_bttn.clicked.connect(self.set_background_green)
            self.apply_bttn.clicked.connect(self.load_file)
            self.close_bttn.clicked.connect(self.close)
    
        def show_file_select_dialog(self):
            file_path, self.selected_filter = QtWidgets.QFileDialog.getOpenFileName(self, "Select File", "",
                                                                                    self.FILE_FILTERS, self.selected_filter)
            if file_path:
                self.filePath_le.setText(file_path)
    
        def update_force_visibility(self, checked):
            self.force_cb.setVisible(checked)
    
        def load_file(self):
            file_path = self.filePath_le.text()
            if not file_path:
                return
    
            file_info = QtCore.QFileInfo(file_path)
            if not file_info.exists():
                om.MGlobal.displayError("File does not exist: {0}".format(file_path))
                return
    
            if self.open_rb.isChecked():
                self.open_file(file_path)
            elif self.import_rb.isChecked():
                self.import_file(file_path)
            else:
                self.reference_file(file_path)
    
        def open_file(self, path):
            force = self.force_cb.isChecked()
            if not force and cmds.file(query=True, modified=True):
                result = QtWidgets.QMessageBox.question(self, "Modified", "Current scene has unsaved changes. Continue?")
                if result == QtWidgets.QMessageBox.StandardButton.Yes:
                    force = True
                else:
                    return
    
            cmds.file(path, open=True, ignoreVersion=True, force=force)
    
        def import_file(self, path):
            cmds.file(path, i=True, ignoreVersion=True)
    
        def reference_file(self, path):
            cmds.file(path, reference=True, ignoreVersion=True)
    
        def set_background_green(self):
            self.title_label.set_background_color(QtCore.Qt.green)
    
    def showWindow():
        global dialog
        try:
            dialog.close()
            dialog.deleteLater()
        except:
            pass
    
        dialog = OpenImportDialog()
        dialog.show()
    
    
    if __name__ == "__main__":
        try:
            dialog.close()
            dialog.deleteLater()
        except:
            pass
    
        dialog = OpenImportDialog()
        dialog.show()
    
    
    
    展开全文
  • 绘图事件paintEvent

    2021-07-25 19:03:05
    绘图事件不用手动调用,通过重写父类虚函数之后会自动调用 ...void paintEvent(QPaintEvent *event) override; 主要代码,可以实现画线、矩形、椭圆、圆、文字、等基本图案 //绘图事件,也不用手动调用,系统.
    • 绘图事件不用手动调用,通过重写父类虚函数之后会自动调用
    • 绘图基本设置,要有画家——画家类
    • 可以设置画笔,比如画笔颜色和线条样式
    • 可以设置画刷,可以对封闭图形进行涂刷。画刷的颜色,和画刷的样式

    设置完画笔之后,不要忘了,要把这个对象传入画家,才能画出美丽的图形

    重写父类虚函数,防止写错,加上override

    //画图事件
    void paintEvent(QPaintEvent *event) override;
    

    主要代码,可以实现画线、矩形、椭圆、圆、文字、等基本图案

    //绘图事件,也不用手动调用,系统会自动调用
    void Widget::paintEvent(QPaintEvent *event)
    {
        //这是画家类,定义一个画家的对象
        QPainter paint(this);
    
        //设置颜色
        paint.setPen(QColor(200, 0, 0));
        //设置线条样式
        //paint.setPen(Qt::DashLine);
        //像pen这种类既可以设置风格,又可以设置颜色,最好就不要用无名对象了\
        把这个对象单独拎出来,最后让画家拿起这个画笔,清晰明了。
        QPen pen;
        pen.setColor(QColor(0, 0, 255));
        pen.setStyle(Qt::DashLine);
        //设置完画笔还可以设置画刷,画刷就是对于封闭图形可以进行颜色填充
        QBrush brush;
        brush.setColor(QColor(0, 255, 0));
        brush.setStyle(Qt::HorPattern);
        //最后别忘了把设置的画笔、画刷给放到笔上呀!!
        paint.setPen(pen);
        paint.setBrush(brush);
    
    
        //画线
        paint.drawLine(QPoint(0, 0), QPoint(100, 100));
    
        //画圆、椭圆
        //这是无名对象,方便快捷,也可以给QPoint定义一个对象point1,如下所示:
        paint.drawEllipse(QPoint(100, 100), 50, 50);
        QPoint point1;
        point1.setX(100);
        point1.setY(100);
    
        //画矩形
        paint.drawRect(QRect(QPoint(100, 100), QPoint(200, 200)));
    
        //画文字
        paint.drawText(QPoint(200, 200), "好好学习,天天向上。。。。");
    }
    

    结果展示:
    在这里插入图片描述
    注意事项:

    1. 在本例中大量使用无名对象,目的就是方便,省事,节约空间时间
    2. 无名对象缺点也很明显,如果需要设置的参数有多个,并且构造函数没有提供,如果多次调用,很可能会被覆盖,仅仅最后一条代码生效
    3. 当形参对象有多个参数时,最好实例化对象,拿出来单独设置,最后将对象整体传入
    展开全文
  • pyqt5 绘图paintEvent

    2021-04-26 15:51:14
    首先是原理,就是重写paintEvent()方法实现画图(可能接触pyqt不久的话对这种实现方式感觉有点奇怪,建议先别管背后的原理,不是说就不学原理了,先会用再去关注原理,前期可以完成任务,学会原理后出现问题后,定位...
  • QT PaintEvent重载后注意事项 PaintEvent继承重载可以实现自定义功能。 子类继承PaintEvent 后原定义的样式需要在PaintEvent 里重新调用画刷 void MImageView::paintEvent(QPaintEvent * event){ // 绘制样式 ...
  • 当调用update(),repaint()的时候,paintEvent()会被调用,另外,当界面有任何改变的时候,paintEvent()也会被调用,这种界面的改变包括界面从隐藏到显示,界面尺寸改变,当然还包括界面内容改变的时候.
  • QT之paintEvent事件

    千次阅读 2017-12-04 18:19:00
    当发生一下情况时会产生绘制事件并调用paintEvent()函数: 1.在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。 2.当重新调整窗口部件的大小时,系统也会产生一个绘制事件。 3.当...
  • PyQt5中paintEvent方法

    千次阅读 2019-12-30 16:32:08
    在pycharm中使用paintEvent方法,内置使用a0关键字,其实这个关键字可以使用任何字符替换 def paintEvent(self, a0: QtGui.QPaintEvent): painter = QPainter(self) painter.begin(self) self.drawext(a0,painter...
  • resizeEvent , paintEvent事件触发原因

    千次阅读 2019-06-27 09:04:37
    一般触发paintEvent事件的有如下几种原因: 窗口显隐导致重画 窗口大小改变,或者重新排布(布局)导致重画 调用update 或者 repaint重画 resizeEvent事件触发: 主要是窗口resize调用或者其他导致窗口事件大小...
  • paintEvent事件可以重新绘制全部或者部分窗口,任何从QWidget派生的类都可以进行重绘。 paintEvent事件的发生可能有以下几个原因: (1)repaint()或者update()被调用 (2)这个窗体之前被隐藏,重新显示时 (3)...
  • qt组件中,show hide控制了一个开关(可能是bool类型的值),这个开关会控制repaint和update是否要发出paintEvent事件。估计内部会调用repaint和update函数。 repaint 和update函数 用于发出paintevent事件。区别有...
  • PyQt5 paintEvent 画线

    2021-01-08 15:55:57
    def paintEvent(self, event): rect = QRect(22, 30, 1737, 0) # 起始坐标(X,Y,X,Y) 长度 painter = QPainter(self) # 红色框线 painter.setPen(QPen(QColor(203,203,203), 1, Qt.SolidLine)) painter....
  • QT 绘制事件 PaintEvent

    千次阅读 2016-12-06 18:04:46
    对事件的响应是通过信号与槽调用 事件中根据事件触发的条件发出不同的信号 比如:鼠标事件发出clicked与dblclicked等信号 QT中事件是怎么实现的?... 覆盖QWidget的paintEvent De...
  • QT的paintevent执行

    千次阅读 2018-08-16 14:24:52
    当发生一下情况时会产生绘制事件并调用paintEvent()函数: 1.在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。 2.当重新调整窗口部件的大小时,系统也会产生一个绘制事件。 3.当...
  • Qt paintEvent中调用upDate

    千次阅读 2018-02-26 09:32:37
    paintEvent中调用upDate之后,会存在大量的内存泄漏。Qt文档中特别强调,在paintEvent中要避免使用upDate和rePaint,否则会出现不可预知的问题
  • QT paintEvent调用时间

    千次阅读 2017-12-26 16:15:12
    当发生一下情况时会产生绘制事件并调用paintEvent()函数: 1.在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。 2.当重新调整窗口部件的大小时,系统也会产生一个绘制事件。 ...
  • Qt paintEvent事件

    2014-08-13 22:45:55
    一.主要理解一下几个方法和属性: 1.QWidget * ...2.void QWidget::paintEvent ( QPaintEvent * ) [虚 保护] 3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 4.void
  • QT中利用paintEvent设置背景图

    千次阅读 2020-05-08 09:00:10
    QT中利用paintEvent设置背景图 重写paintEvent(QPaintEvent *event)事件,利用QPainter这个类来设置背景图片,这样设置的背景图片会随着窗口大小变化而变化。 void MainWindow::paintEvent(QPaintEvent *event) { ...
  • /mnt/hgfs/hnc9/123/test_hzqx/testpaint.cpp:17: error: no ‘void testpaint::paintEvent(QPaintEvent*)’ member function declared in class ‘testpaint’ void testpaint::paintEvent(QPaintEvent *event) ^
  • 关于Qt中的paintEvent事件

    千次阅读 2018-06-18 19:20:14
    以下均来自与Qt文档,未作任何更改void QWidget::paintEvent(QPaintEvent *event)This event handler can be reimplemented in a subclass to receive paint events passed in event.A paint event is a request to ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,285
精华内容 4,914
关键字:

paintevent