标签: paintevent

Qt小部件何时获得paintEvent?

我想知道小部件在哪些情况下接收它的绘制事件,以及它如何随操作系统而变化.

paintEvent的Qt文档仅说明

绘制事件是重新绘制全部或部分窗口小部件的请求.它可能由于以下原因之一而发生:

调用了repaint()或update(),

小部件被遮挡了,现在已被发现,或者

许多其他原因.

到目前为止,我在paintEvent中添加了一些痕迹,

void Widget::paintEvent(QPaintEvent *e)
{
    static int count = 0;
    qDebug("paintEvent, %d", count++);
}
Run Code Online (Sandbox Code Playgroud)

这就是我发现的(至少在Windows 7上):

当窗口小部件失去/获得焦点时,将调用paintEvent.当另一个小部件通过我们的小部件时,不会调用 paint事件.我不知道是不是因为Windows 7合成.恢复最小化窗口时也会调用paintEvent.调整大小时调用paintEvent.

依赖于操作系统的行为是什么?

c++ qt paintevent

19
推荐指数
1
解决办法
2万
查看次数

如何在.Net WinForms控件上绘制自定义边框

我一直在尝试为现有的.Net WinForms控件绘制自定义边框.我试过这个是通过创建一个类来控制我想要改变它的边框颜色,然后在绘画过程中尝试几个东西.我尝试过以下方法:

1.抓住WM_NCPAINT.这有点起作用.下面的代码的问题是,当控件调整大小时,边框将在右侧和底侧被切断.不好.

protected override void WndProc(ref Message m)
{
  if (m.Msg == NativeMethods.WM_NCPAINT) {
    WmNcPaint(ref m);
    return;
  }
  base.WndProc(ref m);
}

private void WmNcPaint(ref Message m)
{
  if (BorderStyle == BorderStyle.None) {
    return;
  }

  IntPtr hDC = NativeMethods.GetWindowDC(m.HWnd);
  if (hDC != IntPtr.Zero) {
    using (Graphics g = Graphics.FromHdc(hDC)) {
      ControlPaint.DrawBorder(g, new Rectangle(0, 0, this.Width, this.Height), _BorderColor, ButtonBorderStyle.Solid);
    }
    m.Result = (IntPtr)1;
    NativeMethods.ReleaseDC(m.HWnd, hDC);
  }
}
Run Code Online (Sandbox Code Playgroud)

2.覆盖void OnPaint.这适用于某些控件,但不是全部.这也需要你设置BorderStyleBorderStyle.None,你必须手动清除油漆背景,否则在调整大小时得到这个. …

c# controls paintevent winforms

7
推荐指数
1
解决办法
4712
查看次数

如何将窗口小部件子类化以向其添加更多元素?

我正在尝试创建一个QTableView嵌入QLineEdit在顶部的子类,以便按照您的类型过滤结果.我需要我的表具有与普通相同的API QTableView,所以我想将其子类化而不是子类化QWidget并添加一个QLineEditQTableView它.

我以为我可以重新实现paintEvent(QPaintEvent*),改变它QPaintEventrect()开始有点低(a的高度QLineEdit,所以它在它之下绘制)然后通过它QTableView::paintEvent(),但是QPaintEvent参数只能决定哪个区域需要重新绘制,而不是应该绘制小部件的区域.

qt subclass qtableview paintevent qlineedit

4
推荐指数
1
解决办法
4556
查看次数

为什么QPainter可能拒绝在paintEvent中工作?

我有:

class QTextEditEnter : public QTextEdit
{
    Q_OBJECT
public:
    QTextEditEnter( QWidget *_parent ) : QTextEdit(_parent)
    {
        this -> setFrameStyle( QFrame::Sunken ); // Sunken!
    }

protected:
    virtual void keyPressEvent(QKeyEvent * event);
    virtual void paintEvent(QPaintEvent *_event)
    {
        QTextEdit::paintEvent( _event );
        QPainter pnt(this);
        pnt.setPen( QColor( 0, 0, 0, 0xff ));
        pnt.drawRect( 0, 0, width(), height());
    }

    signals:
        void signalPressEnter();
};
Run Code Online (Sandbox Code Playgroud)

这给了:

QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active
QPainter::begin: Widget …
Run Code Online (Sandbox Code Playgroud)

c++ user-interface qt paintevent

4
推荐指数
1
解决办法
2756
查看次数

如何在Windows窗体中平滑面板中重新绘制

如何将面板重漆成光滑的?

我使用的计时器panel1.Invalidate();每 300 毫秒使面板 () 失效,然后当panel1_Paint我向该面板添加图像时,问题是它看起来像是在跳跃,我需要以最快的速度在其上移动一个图像能。

这是截屏问题的链接:http://screencast.com/t/HdtIV99YN

 private void panel1_Paint(object sender, PaintEventArgs e)
            {
                PaintMapObstacles(e);
                PaintMapStartAndGoal(e);

                if (trayectoryIndex < 1000)
                {
                   MapPoint point =  GetTrayectoryPoint(0, trayectoryIndex);
                   e.Graphics.DrawImage(new Bitmap("robot.jpg"), point.X*squareSize, point.Y*squareSize, 60, 60);
                   trayectoryIndex++;
               }
            }
     private void PaintMapStartAndGoal(PaintEventArgs e)
            {
                MapPoint start = new MapPoint { X = 0, Y = 0 };
                MapPoint goal = new MapPoint { X = 7, Y = 8 };
                   // e.Graphics.DrawImage(new Bitmap("start.jpg"), start.X * squareSize, start.Y * squareSize, …
Run Code Online (Sandbox Code Playgroud)

c# paint panel paintevent winforms

3
推荐指数
1
解决办法
2492
查看次数

Qt paintEvent崩溃了

我试图在我的小部件上绘制简单的板.

当我试图自动化时,我的paintEvent崩溃了.我认为它是由for循环引起的,我是对的吗?如何以其他方式绘画?

void Widget::paintEvent(QPaintEvent *event)
{
QPixmap myPix( QSize(20,20) );
QPainter painter(this);
for(int i = 0; i < 100; i+5){
    painter.drawLine(QPointF(i,0),QPointF(i,max));
}
this->setPixmap(myPix);
}
Run Code Online (Sandbox Code Playgroud)

c++ qt for-loop paintevent

3
推荐指数
1
解决办法
952
查看次数

Qt 自定义动画按钮

我正在尝试创建自定义动画按钮我找到了此页面:按钮示例

我喜欢这个网站上的 3 和 19。我试过做3个,但不一样。有人能帮我吗?

动图

我的网站上第三个按钮的代码:

 # -*- coding: utf-8 -*-
import sys, os, time, math
from PySide6 import QtCore, QtWidgets, QtGui
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *


class EButton3(QPushButton):
    AnimateEnabled = True
    Radius = 10

    _m_Text = ""
    def __init__(self, parent=None):
        super(EButton3, self).__init__(None)
        self.enterEvent = self.Custom_enterEvent
        self.leaveEvent = self.Custom_leaveEvent
        self.setText("Button")
    def getText(self):
        return self._m_Text
    def setText(self, Text):
        self._m_Text = Text
        self.update()

    _m_hover=False
    def isHover(self):
        return self._m_hover

    def paintEvent(self, event: QPaintEvent):
        ret = …
Run Code Online (Sandbox Code Playgroud)

qt pyqt paintevent pyside pyqt5

3
推荐指数
1
解决办法
535
查看次数

使用 Qt 以编程方式绘制线条

我想在两点之间的 QLabel 中以编程方式添加线。根据我的发现,似乎唯一的方法是将 QWidget 子类化以更改 PaintEvent() 保护方法。

因此,我从 QWidget 创建了一个新类“QLineObject”。这是我的头文件:

class QLineObject : public QWidget
{
    Q_OBJECT

public:
    QLineObject();
    QLineObject(Point from, Point to);

protected:
    void paintEvent(QPaintEvent *event);

private:
    Point fromPoint;
    Point toPoint;
};
Run Code Online (Sandbox Code Playgroud)

和实现文件:

QLineObject::QLineObject()
{
    Point point;
    point.x = 0.0;
    point.y = 0.0;

    fromPoint = point;
    toPoint = point;
}

QLineObject::QLineObject(Point from, Point to)
{
    fromPoint = from;
    toPoint = to;
}

void QLineObject::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawLine(fromPoint.x, fromPoint.y, toPoint.x, toPoint.y);
}
Run Code Online (Sandbox Code Playgroud)

问题来了。我找不到如何在我的主窗口中添加这个小部件。如果我创建 QLineObject 的新实例并调用 show(),它会弹出一个新窗口。我确定我只是错过了一些东西。有人愿意帮助我吗?我想知道如何从我的主窗口构造函数的其他地方创建和添加它。

谢谢!

c++ qt paintevent

2
推荐指数
1
解决办法
1965
查看次数

如何使用 Paint 事件在鼠标坐标处绘制形状

我最近开始C#明显地编程,并试图做一个简单的WinForms应用程序,它采用鼠标坐标并根据坐标缩放矩形。

我面临的问题是我不知道如何调用使用更多参数的方法(在这种情况下是x,yPaintEventArgs)。或者,我确实知道如何处理PaintEvent.

这是整个代码,因为它很短而且很简单:

using System;
using System.Drawing;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        int x = e.X; 
        int y = e.Y;
        String data = (x.ToString() + " " + y.ToString());
        DrawRect(Something, x, y);
    }

    PaintEventArgs pEventArgs;
    private void Form1_Paint(object sender, PaintEventArgs e)
    {

    }

    public void DrawRect(PaintEventArgs e, int rey, int rex)
    {
        Graphics gr = e.Graphics;
        Pen …
Run Code Online (Sandbox Code Playgroud)

.net c# graphics paintevent winforms

1
推荐指数
1
解决办法
1768
查看次数

Qt - 创建QPainter

我正在尝试paintEvent在我的程序中重写方法并更改它.

void MainWindow::paintEvent(QPaintEvent *event)
{
    QRegion reg = this->bgPixmapHandle->rect();
    QPainter painter(this);

    painter.setClipRegion(reg);
    painter.drawImage(bgPixmapHandle->rect(), bgPixmapHandle);
    painter.end();
}
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试改变我的bg形象.但我在网上收到了错误:QPainter painter(this);

错误:变量'QPainter painter'已初始化,但类型不完整

c++ qt qpainter paintevent

0
推荐指数
1
解决办法
2100
查看次数