我想知道小部件在哪些情况下接收它的绘制事件,以及它如何随操作系统而变化.
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.
依赖于操作系统的行为是什么?
我一直在尝试为现有的.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.这适用于某些控件,但不是全部.这也需要你设置BorderStyle为BorderStyle.None,你必须手动清除油漆背景,否则你在调整大小时得到这个. …
我正在尝试创建一个QTableView嵌入QLineEdit在顶部的子类,以便按照您的类型过滤结果.我需要我的表具有与普通相同的API QTableView,所以我想将其子类化而不是子类化QWidget并添加一个QLineEdit和QTableView它.
我以为我可以重新实现paintEvent(QPaintEvent*),改变它QPaintEvent的rect()开始有点低(a的高度QLineEdit,所以它在它之下绘制)然后通过它QTableView::paintEvent(),但是QPaintEvent参数只能决定哪个区域需要重新绘制,而不是应该绘制小部件的区域.
我有:
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) 如何将面板重漆成光滑的?
我使用的计时器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) 我试图在我的小部件上绘制简单的板.
当我试图自动化时,我的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) 我正在尝试创建自定义动画按钮我找到了此页面:按钮示例
我喜欢这个网站上的 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) 我想在两点之间的 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#明显地编程,并试图做一个简单的WinForms应用程序,它采用鼠标坐标并根据坐标缩放矩形。
我面临的问题是我不知道如何调用使用更多参数的方法(在这种情况下是x,y和PaintEventArgs)。或者,我确实知道如何处理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) 我正在尝试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'已初始化,但类型不完整