Эта проблема связана с VS Code на Win10 и Python 3.6.6.Я новичок как в Python, так и в PySide2.
Я прочитал много тем по этому вопросу здесь, в StackOverflow, и, возможно, это дубликат другой темы, но я не могу раскрасить свой виджет.
Я понимаю, что paintEvent () объекта виджета нужно каким-то образом переопределить.В большинстве примеров есть рисование в главном окне, но я не могу перенести это на виджеты из файла ui.file.
Я создал два класса в своем .py-файле, MainFormи ящик.MainForm содержит реализацию пользовательского интерфейса, и я пытаюсь нарисовать виджет (названный "widget").В моем .ui-файле есть виджет и графическое изображение.Я пытаюсь реализовать рисование на виджете.Файл
paintEventTest.py выглядит следующим образом:
import sys
from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import (
QApplication, QPushButton, QLineEdit, QTextEdit, QSpinBox, QMainWindow, QDesktopWidget, QTableWidget,
QTableWidgetItem, QToolButton, QToolTip)
from PySide2.QtCore import QFile, QObject, Qt
class MainForm(QMainWindow):
def __init__(self, ui_file, parent=None):
super(MainForm, self).__init__(parent)
ui_file = QFile(ui_file)
ui_file.open(QFile.ReadOnly)
### Load UI file from Designer ###
loader = QUiLoader()
self.ui_window = loader.load(ui_file)
ui_file.close()
self.ui_window.show()
### THIS IS NOT WORKING (OBVIOUSLY?) ###
widget = self.ui_window.widget
drawer = Drawer()
drawer.paintEvent(widget)
class Drawer(QtWidgets.QWidget):
def paintEvent(self, e):
'''
the method paintEvent() is called automatically
the QPainter class does all the low-level drawing
coded between its methods begin() and end()
'''
qp = QtGui.QPainter()
qp.begin(self)
self.drawGeometry(qp)
qp.end()
def drawGeometry(self, qp):
qp = QtGui.QPainter(self)
qp.setPen(QtGui.QPen(Qt.green, 8, Qt.DashLine))
qp.drawEllipse(40, 40, 400, 400)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle('Fusion')
form = MainForm('./UI designer/testUI.ui')
sys.exit(app.exec_())
testUI.ui выглядит следующим образом и реализован в папке «Дизайнер пользовательского интерфейса»:
<?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>731</width>
<height>633</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGraphicsView" name="graphicsView">
<property name="minimumSize">
<size>
<width>0</width>
<height>200</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="minimumSize">
<size>
<width>0</width>
<height>250</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>300</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>731</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Iполучаю это с кодом выше.Я не ожидаю, что это сработает, но на самом деле понятия не имею, как ссылаться на конкретный виджет для рисования.
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::end: Painter not active, aborted
Меня также интересует рисование эквивалентного кода в графическом представлении с графической сценой и графическим элементом.