- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在某个标签中绘制一个矩形,我使用 QtDesigner 制作了一个 GUI,它在一个名为“class Ui_MainWindow(QMainWindow):”的类中生成整个 GUI 代码,并且我在窗口中使用了三个选项卡。
我在标签上使用 QMouseEvent 时遇到问题,我找到了使用此代码的解决方案
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
import sys
import cv2
from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QImage
class Ui_MainWindow(QMainWindow):
def __init__(self):
# super(Ui_MainWindow, self).__init__ ()
super().__init__()
self.count = 0
self.frame = 0
self.fileName="0"
self.imagesTab2 = []
self.k = 0
self.i = 1
self.w = 0
self.h = 0
self.coordPt = []
self.dictListClasses = {
"face" :[],
"car" : [] }
self.dictColorClasses = {
"face" :(0, 100, 255),
"car" : (0,255, 0) }
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(655, 364)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
self.tab.setObjectName("tab")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(self.tab)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.label = QtWidgets.QLabel(self.tab)
self.label.setText("")
self.label.setObjectName("label")
self.label.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label.setFrameShadow(QtWidgets.QFrame.Sunken)
self.setMouseEventDelegate(self.label)
self.verticalLayout_2.addWidget(self.label)
self.verticalLayout_2.setStretch(1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.tabWidget.addTab(self.tab_2, "")
self.verticalLayout.addWidget(self.tabWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 655, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Open"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
self.pushButton.clicked.connect(self.openFileTab2)
def setMouseEventDelegate (self, setQWidget):
def subWidgetMousePressEvent(e: QtGui.QMouseEvent):
if self.imagesTab2:
if e.button() == Qt.LeftButton:
po = int(e.x()*self.w/self.label.width())
pa = int(e.y()*self.h/self.label.height())
self.coordPt = [(po, pa)]
print("coords click = ", self.coordPt)
self.begin = e.pos()
self.end = e.pos()
self.label.update()
print("begin 1= ",self.begin, self.end)
def subWidgetMouseMoveEvent(e: QtGui.QMouseEvent):
if self.imagesTab2:
self.end = e.pos()
self.label.update()
def subWidgetMouseReleaseEvent(e: QtGui.QMouseEvent):
if e.button() == Qt.LeftButton:
if self.imagesTab2:
if e.x() >= 0 and e.y() >= 0 and e.x()<self.label.width() and e.y()<self.label.height():
po = int(e.x()*self.w/self.label.width())
pa = int(e.y()*self.h/self.label.height())
self.coordPt.append((po, pa))
print("coords release = ", self.coordPt)
self.begin = e.pos()
self.end = e.pos()
self.label.update()
print("begin 2= ",self.begin, self.end)
self.dictListClasses["car"].append(self.coordPt)
print("LL + ", self.dictListClasses)
setQWidget.mousePressEvent = subWidgetMousePressEvent
setQWidget.mouseReleaseEvent = subWidgetMouseReleaseEvent
setQWidget.mouseMoveEvent = subWidgetMouseMoveEvent
def openFileTab2(self):
self.imagesTab2, _ = QtWidgets.QFileDialog.getOpenFileNames(None,"Select one or more images to open", "/Images","Images (*.jpg *.jpeg .*bmp .*png);;All Files (*)")
if self.imagesTab2:
self.showImageInLabel(self.imagesTab2[0])
# self.label_9.setText("Image 1")
def showImageInLabel(self, img):
pix = QPixmap(img)
self.w = pix.width()
self.h = pix.height()
print("Image resolution = ", '(',self.w,')', '(',self.h,')')
pix = pix.scaled(self.size(), aspectRatioMode=QtCore.Qt.KeepAspectRatio, ) # To scale image for example and keep its Aspect Ration
self.label.setPixmap(pix)
self.label.setScaledContents(True)
def nextImageTab2(self):
if not self.imagesTab2:
print("No files, please open one or more images")
return
if self.i < len(self.imagesTab2):
path = self.imagesTab2[self.i]
self.showImageInLabel(path)
self.i += 1
print(self.i)
x = "Image " + str(self.i)
# self.label_9.setText(x)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
上面的代码是重写三个函数:mousePressEvent、mouseReleaseEvent 和 mouseMoveEvent因为如果我只使用 def mouseMoveEvent (self, event):
例如,它在我的标签上不起作用,我不知道如何将其设置为在某个标签上工作
所以我尝试重写 QPaintEvent 函数,但是如果我使用上面的代码并使用这个 setQWidget.paintEvent = subWidgetPaintEvent
标签就会消失,我只找到一个矩形
任何人都可以帮助我使用我的标签上的事件,就像这段代码一样,谢谢
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter, QColor, QBrush
from PyQt5 import QtWidgets, QtCore, QtGui
class Labella(QLabel):
def __init__(self, parent):
super().__init__(parent=parent)
self.setStyleSheet('QFrame {background-color:white;}')
self.resize(300, 300)
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
def paintEvent(self, event):
qp = QtGui.QPainter(self)
br = QtGui.QBrush(QtGui.QColor(100, 10, 10, 40))
qp.setBrush(br)
qp.drawRect(QtCore.QRect(self.begin, self.end))
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
print("beegin = ", self.begin)
print("end 1 = ", self.end)
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
def drawRectangles(self, qp):
qp.setBrush(QColor(255, 0, 0, 100))
qp.save() # save the QPainter config
qp.drawRect(10, 15, 20, 20)
qp.setBrush(QColor(0, 0, 255, 100))
qp.drawRect(50, 15, 20, 20)
qp.restore() # restore the QPainter config
qp.drawRect(100, 15, 20, 20)
class Example(QWidget):
def __init__(self):
super().__init__()
lb = Labella(self)
self.setGeometry(300, 300, 350, 300)
self.setWindowTitle('Colours')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
最佳答案
解决方案是提升 Labella 在 Qt Designer 中使用,为此您必须首先创建文件 labella.py。
labella.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Labella(QtWidgets.QLabel):
def __init__(self, parent):
super().__init__(parent=parent)
self.setStyleSheet('QFrame {background-color:white;}')
self.resize(300, 300)
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
def paintEvent(self, event):
super().paintEvent(event)
qp = QtGui.QPainter(self)
br = QtGui.QBrush(QtGui.QColor(100, 10, 10, 40))
qp.setBrush(br)
qp.drawRect(QtCore.QRect(self.begin, self.end))
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
print("beegin = ", self.begin)
print("end 1 = ", self.end)
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def drawRectangles(self, qp):
qp.setBrush(QColor(255, 0, 0, 100))
qp.save() # save the QPainter config
qp.drawRect(10, 15, 20, 20)
qp.setBrush(QColor(0, 0, 255, 100))
qp.drawRect(50, 15, 20, 20)
qp.restore() # restore the QPainter config
qp.drawRect(100, 15, 20, 20)
然后我们将 labella.py 和将调用 mainwindow.ui
的 .ui 放在同一文件夹中
.
├── labella.py
└── mainwindow.ui
您可以通过获取以下内容来打开 .ui 文件:
右键单击QLabel
并选择选项:升级到...
填写如下图所示的字段,然后按添加
按钮,然后按推广
按钮:
最后在pyuic5的帮助下再次生成.py:
pyuic5 mainwindow.ui -o mainwindow.py -x
关于python - 使用paintEvent 在 QLabel 中绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51768266/
你好,我试图在java中创建一个网格并绘制每个单元格,但我不知道我做错了什么。每个单元格都是一个 JPanel,我将每个单元格添加到 mazePanel。之后 mazePanel 添加到框架中。但只能
我正在开发一个应用程序(适用于 iOS 和 Android),其中我需要允许用户从图库中选择照片并通过在图像上绘图来圈出某些项目。一旦用户完成绘制,系统就会提示他在弹出窗口中为该项目命名。命名项目后,
当我使用绘画/绘图应用程序时,我从未注意到在按下手指和能够看到显示屏上绘制的内容之间存在延迟。但是,对于我的应用程序,接收到的初始触摸非常缓慢。第二个、第三个和第四个手势每秒接收 60 个,但第一个手
到目前为止,在我的尝试中,我能够在普通图像上画线,比如创建我自己的 CGRect 大小的普通上下文并在其上画线。我看到的所有教程都是如何在创建的 x*y 大小的图像上下文上绘制。但是我想在已经存在的图
我在 android 中开发,我必须为 android 做一个 Paint。 我正在使用下面的代码,当我执行代码时,绘制工作正常,但是,似乎有 2 个表面要绘制,当你绘制一个时,另一个消失了。 我一直
我使用QGraphicsView、QGraphicsScene 和QGraphicsItem 来绘制一些图表。我已经实现了用于绘制文本(图表的值)的 QGraphicsItem::paint 函数,但
Canvas { id: canvas onPaint: { if (personalInfo.count === 0) { return
好的,这就是问题所在:在 C# 表单中,我创建了一个新的私有(private) void: private void NewBtn(string Name, int x, int y) 它的目的是创建
任何人都可以详细建议我如何使用 QDirectPainter 类直接在帧缓冲区上绘制小部件。如果您能提供一个工作示例,我会更有帮助。 最佳答案 QDirectPainter 不会也不能绘制任何东西。它
我正在使用 cardLayout 更改“ View ”(此类有一个 JFrame 变量)。当用户点击新游戏按钮时,会发生这种情况: public class Views extends JFrame
目标: 我想在 pdf 位图上绘制/书写/绘画并将它们保存在一起,以便我可以通过电子邮件发送给他们。 详细信息: 我有多个 Pdf包含 5-20 的文件每个页面,现在我正在从 pdfs 中提取位图并将
我最近开始学习Qt。 我不太清楚如何使用 QPainter 类进行绘画。假设我只想在窗口中放置几个点: class PointDrawer: public QWidget { Q_OBJE
我必须为我的 CS 类(class)期末项目创建一个带有 GUI 的 connect 5 游戏。我在最后一个项目中使用 Graphics2D - 迷宫 - 使用 Graphics2D 是一场噩梦。 c
我已经删除了 CS_HREDRAW、CS_VREDRAW。 消息 WM_PAINT 和 WM_ERASEBKGND 什么都不做,但是一旦窗口重新调整大小,它就会用背景颜色重新绘制它。有什么办法可以完全
首先大家好! 我遇到了一个大问题:我需要构建一个程序,该程序包括构建一个包含 5 个方 block 和一个按钮的 java swing 界面。按钮功能是在方 block 内画一个圆。我有这段代码,但我
我正在尝试从显示幻灯片的 Qt fluidLauncher 演示中运行稍微修改过的代码。代码贴在下面。当处理 paintEvent 时,屏幕上会显示一个黑色矩形,因为导入的图像大小为 0。 单步执行Q
我有以下代码来激活/停用橡皮擦: public PorterDuffXfermode clear = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
我正在绘制一个未被清除的 Canvas ,并使 Canvas 随着时间的推移逐渐变成纯色,或者在 alpha 中逐渐消失以显示后面的图层。 我的第一直觉是简单地用每帧的低 alpha 在绘图上填充一个
我正在尝试在每幅画上检测并绘制一个矩形轮廓,例如这张图片: 我遵循了一些指南并执行了以下操作: 灰度转换 应用中值模糊 锐化图像 应用自适应阈值 应用形态梯度 寻找轮廓 绘制轮廓 得到如下结果: 我知
创建 JFrame、在其上添加 JPanel 并在 JPanel 上绘制矩形的类 class Frame { JFrame frame; myPanel panel; void draw() {
我是一名优秀的程序员,十分优秀!