- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 PyQt 矢量绘画。目前我一直在尝试将信息传递给 paintEvent() 方法,我猜应该调用其他方法:
我正在尝试将不同的数字绘制到一个基本 block (这里是 drawFundBlock() 方法,它应该画一些线)。该代码试图检查是否按下了右箭头-> drawFundamental block ,如果按下了数字(现在尝试简单地绘制“5”),它将在该基本 block 的某个区域绘制该数字。但我似乎无法让 QPainter 工作。似乎它现在两次调用 paintEvent() 覆盖方法(为什么?)。有人建议使用 update() 方法,但我不知道如何将任何参数传递给 paintEvent(),它应该确定是绘制“fundblock”还是“number”。现在代码使用 update() 进行演示,但这只是移动了行 - 但是应该保留已经添加的行!
有什么帮助吗?
# Test QPainter etc.
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QPen, QColor, QFont
from PyQt5.QtCore import Qt, QPoint, pyqtSignal, QRect
import sys
class Example(QWidget):
paintTrigger = pyqtSignal()
def __init__(self):
super().__init__()
self.initUI()
self.ydist = 15
self.eveType = "drawBlock"
self.currentRegion = QRect(50,50,50,80)
#self.paintTrigger[self.eveType].connect(lambda:self.paintEvent())
self.x0=5
self.x1=25
self.y0=5
self.y1=25
def initUI(self):
self.setGeometry(300,300,280,270)
self.setWindowTitle('Painter training')
self.show()
# How to pass info here, which type of drawing should be done (block or number)?
def paintEvent(self,event):
qp = QPainter(self)
qp.begin(self)
self.drawFundBlock(qp)
qp.end()
def drawFundBlock(self,qp):
pen = QPen(Qt.black, 2, Qt.SolidLine)
pen.setStyle(Qt.DashLine)
qp.setPen(pen)
for i in range(1,10):
#qp.drawLine(0,i*self.ydist,40,i*self.ydist)
qp.drawLine(self.x0,i*self.y0,self.x1,self.y0*i)
#notePoint=QPoint(200,200)
#qp.drawText(notePoint,"5")
def drawNumber(self,qp,notePoint):
pen = QPen(Qt.black,2,Qt.SolidLine)
#qp.setPen(QColor(200,200,200))
qp.setPen(pen)
qp.setFont(QFont('Arial', 10))
qp.drawText(notePoint,"5")
def nextRegion(self):
self.x0=self.x0+30
self.x1=self.x1+30
self.y0=self.y0+30
self.y1=self.y1+30
def keyPressEvent(self,event):
# Did the user press a button??
gey=event.key()
if gey == Qt.Key_M:
print("Key 'm' pressed!")
elif gey == Qt.Key_Right:
print("Right key pressed!, call drawFundBlock()")
#self.paintTrigger["drawBlock"].emit()
#self.paintEvent()
self.update()
self.nextRegion()
elif gey == Qt.Key_5:
print("#5 pressed, call drawNumber()")
#self.paintTrigger["drawNo"].emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
最佳答案
QPaintEvent
不应该直接调用,我们必须通过 update()
来调用,这将在必要时在内部调用它。
每次 QPaintEvent
被调用时,这个干净的空间就是它要绘制的空间,因此它不会节省以前绘制的内存,一个简单的解决方案是先绘制一个 QPixmap
它将存储您之前绘制的内容,然后使用该 QPixmap
绘制小部件。
另一件事是以下 2 条指令是等效的:
1.
painter = QPainter(some_QPaintDevice)
2.
painter = QPainter()
painter.begin(some_QPaintDevice)
这两种方法都用于将对象传递到要绘制的位置,在您的情况下,您分配了 2 次相同的小部件。
为了方便画图我提出了方法drawBackground
,这个方法需要填写self.func
,第一个参数必须是函数名和第二个字典包含除 QPainter
之外所需的参数。
代码
class Example(QWidget):
def __init__(self):
super().__init__()
self.mModified = True
self.initUI()
self.currentRegion = QRect(50, 50, 50, 80)
self.x0 = 5
self.x1 = 25
self.y0 = 5
self.y1 = 25
self.mPixmap = QPixmap()
self.func = (None, None)
def initUI(self):
self.setGeometry(300, 300, 280, 270)
self.setWindowTitle('Painter training')
self.show()
def paintEvent(self, event):
if self.mModified:
pixmap = QPixmap(self.size())
pixmap.fill(Qt.white)
painter = QPainter(pixmap)
painter.drawPixmap(0, 0, self.mPixmap)
self.drawBackground(painter)
self.mPixmap = pixmap
self.mModified = False
qp = QPainter(self)
qp.drawPixmap(0, 0, self.mPixmap)
def drawBackground(self, qp):
func, kwargs = self.func
if func is not None:
kwargs["qp"] = qp
func(**kwargs)
def drawFundBlock(self, qp):
pen = QPen(Qt.black, 2, Qt.SolidLine)
pen.setStyle(Qt.DashLine)
qp.setPen(pen)
for i in range(1, 10):
qp.drawLine(self.x0, i * self.y0, self.x1, self.y0 * i)
def drawNumber(self, qp, notePoint):
pen = QPen(Qt.black, 2, Qt.SolidLine)
qp.setPen(pen)
qp.setFont(QFont('Arial', 10))
qp.drawText(notePoint, "5")
def nextRegion(self):
self.x0 += 30
self.x1 += 30
self.y0 += 30
self.y1 += 30
def keyPressEvent(self, event):
gey = event.key()
self.func = (None, None)
if gey == Qt.Key_M:
print("Key 'm' pressed!")
elif gey == Qt.Key_Right:
print("Right key pressed!, call drawFundBlock()")
self.func = (self.drawFundBlock, {})
self.mModified = True
self.update()
self.nextRegion()
elif gey == Qt.Key_5:
print("#5 pressed, call drawNumber()")
self.func = (self.drawNumber, {"notePoint": QPoint(100, 100)})
self.mModified = True
self.update()
关于python - PyQt5 使用 keyPressEvent() 触发 paintEvent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46934526/
我正在编写一个简单的 GUI,它将在特定点打开一个 opencv 窗口。这个窗口有一些非常基本的 keyEvents 来控制它。我想通过一些功能来推进这一点。因为我的 QtGui 是我的 Contro
我无法理解 keyPressEvent 方法在该程序中的工作原理。具体来说,这里的“e”是什么? keyPressEvent 是使用预先存在的实例“e”重新定义的方法吗? import sys fro
我对 KeyPressEvent 有疑问, 我需要移动一个 QGraphicsItem播放器在我的场景中,但程序没有使用函数KeyPressEvent类game 文件“game.h”: #ifndef
我在QT上写作。 OpenGL 已连接,工作正常,但事件和 keyPressEvent mousePressEvent 不响应击键。 class MainWindow : public QGLWidg
我正在尝试在 Qt 上创建一个玩家可以沿对角线前进的游戏。所以当我按下 W 和 D 时,玩家可以转到右上角。但是,当我先按 W,然后按 D,然后松开 D 时,播放器不会朝 W 方向移动。事实上,按住
` from PyQt5.QtCore import Qt import sys from PyQt5.QtWidgets import QApplication, QMainWindow from
我想声明一个 com.google.gwt.event.dom.client.KeyPressEvent。它应该匹配任何字符或数字,以及 ,.-+~ 等符号。特别是我想排除所有“导航”键,如箭头、插入
我需要生成键盘输入,因为我有一个事件附加到此输入。我试着打电话: keyPressEvent(Qt::Key_Delete); 没有成功,有没有办法生成这个 keyPressEvent ? 最佳答案
我正在创建一个绘制颜色的程序,然后另一个类检查它们并在它们匹配时返回 true。整个代码都在一个对话框中。 colQ 是一个简单存储 RGB 值和其他东西的类;我们将使用这些来获取 RGB。 colD
我写了这段代码,但是我得到了这个错误: "left of '->key' must point to class/struct/union/generic type". 考虑到 GUI 是从 QWid
我有一个程序可以捕获单个按键,然后输出被按下的键。问题是,我无法返回按下的键的值,也无法让箭头键输出任何内容。这是我的代码: myApp.h class someClass: public QDial
我有一个主窗口,我在其中建立了标准的“编辑”>“剪切/复制/粘贴”操作,菜单操作链接到 QTextEdit 的相关插槽,它是主窗口的子窗口。 主窗口有一个不同的子窗口(在拆分器的另一侧),它显示一个
我从 PyQt GPL v5.4 创建一个 UI 并使用 pyuic5 将 *.ui 文件转换为 *.py 但我不知道 keyPressEvent 在这段代码中是如何工作的!! 它应该适用于 QWid
我有一个主要的 Widget 并且在这个主要的小部件里面我有 QListWidget 和两个按钮。我已经覆盖了主小部件内的 keyPressEvent(继承自 QWidget)。当焦点不在 QList
我有一个简单的表单,其中包含一些组合、标签、按钮和一个 QTextEdit。 我尝试使用 keyPressEvent 捕捉输入或返回键,但由于某些原因我无法捕捉。然而,我也使用的 ESC 键被识别。
当我按下按键时,此代码有效,但不适用于 Print Screen 键。 void KeyHooker::keyPressEvent(QKeyEvent *event) { qDebug() k
我想通过发送 KeyEvent 将字符附加到 QLineEdit。我正在使用这样的代码: ui.myEdit->setFocus(); for(size_t i = 0; i myEdit->setT
某些小部件将允许我这样做: self.widget.clicked.connect(on_click) 但是在做: self.widget.keyPressEvent.connect(on_key)
我正在尝试在 QT 中重写 QWidgets keyPressEvent 函数,但它只是行不通。我不得不说我是 CPP 的新手,但我知道 ObjC 和标准 C。 我的问题是这样的: class QSG
在我们的应用程序中,有一个用户控件,它允许输入一个数字(在 numericupdown 内),然后是一个 组合框,它允许选择 SI 前缀( [p, n, µ, m, -, k, M, G, T] 从小
我是一名优秀的程序员,十分优秀!