Für mein neustes Projekt würde ich gerne 2 verschiedene `QWidget` (aktuell `QLabel`), die ich mit dem Qt Designer in einem `QMainWindow` platziert habe, zu jeweils einem eigenen Zeichenfeld (Canvas) machen, in denen man mit gedrückter Maustaste Linien zeichnen kann.
Mit der Hilfe von Beispielcode konnte ich schon einen Prototypen mit einem Zeichenfeld bauen. In diesem Prototypen wird aber leider nicht an der aktuellen Position des Mauszeigers gezeichnet, sondern darunter. Ich vermute das Problem bei der Größenangabe der `QPixmap(400, 300)`.
Ist meine Vermutung richtig und wie kann man das Problem lösen?
Mit dem Code für das zweite Zeichenfeld (unten auskommentiert) funktioniert dann leider gar nichts mehr. Es erscheinen folgende Fehlermeldungen, wenn man versucht etwas zu zeichnen:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
Traceback (most recent call last):
File "/home/ata/source/paint/main.py", line 34, in mouseMoveEvent
painter_left = QPainter(self.label_left.pixmap())
RuntimeError: wrapped C/C++ object of type QLabel has been deleted
main.py
Code: Alles auswählen
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPixmap, QPainter
from PyQt5.QtCore import Qt
from PyQt5.uic import loadUi
class MainWindow(QMainWindow):
# Based on
# https://www.learnpyqt.com/courses/custom-widgets/bitmap-graphics/ and
# https://codeloop.org/python-gui-how-to-create-paint-application-in-pyqt5/
def __init__(self):
super().__init__()
loadUi("mainwindow.ui", self)
canvas_left = QPixmap(400, 300)
canvas_left.fill(Qt.white)
self.label_left.setPixmap(canvas_left)
self.setCentralWidget(self.label_left)
# canvas_right = QPixmap(400, 300)
# canvas_right.fill(Qt.white)
# self.label_right.setPixmap(canvas_right)
# self.setCentralWidget(self.label_right)
self.last_x, self.last_y = None, None
def mouseMoveEvent(self, e):
if self.last_x is None: # First event.
self.last_x = e.x()
self.last_y = e.y()
painter_left = QPainter(self.label_left.pixmap())
painter_left.drawLine(self.last_x, self.last_y, e.x(), e.y())
painter_left.end()
# painter_right = QPainter(self.label_right.pixmap())
# painter_right.drawLine(self.last_x, self.last_y, e.x(), e.y())
# painter_right.end()
self.update()
# Update the origin for next time.
self.last_x = e.x()
self.last_y = e.y()
def mouseReleaseEvent(self, e):
self.last_x = None
self.last_y = None
def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
app.exec_()
if __name__ == "__main__":
main()
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_left">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_right">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Gruß
Atalanttore