QWidget в качестве контейнера:
В этом случае я не рекомендую применять рекламную акцию, потому что это сильно усложняет задачу, но я покажу, как применить решение, показанное в мой другой ответ : Используйте QWidget в качестве контейнера в .ui.
Для примера, я создал .ui с несколькими компонентами, и где вы хотите разместить QChartView, поместите QWidget (чтобы сделать его видимым, у меня есть установить зеленый цвет фона):
design.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>636</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
</item>
<item row="1" column="0">
<widget class="QTableWidget" name="tableWidget"/>
</item>
<item row="0" column="1" rowspan="2">
<widget class="QWidget" name="widget" native="true">
<property name="styleSheet">
<string notr="true">background-color: rgb(138, 226, 52);</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>636</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Тогда лог c просто: получите QWidget через objectName, которое в данном случае является «виджетом», затем поместите макет внутри этого виджета, а затем поместите QChartView внутри виджета через макет.
import random
import sys
from PySide2 import QtCore, QtGui, QtUiTools, QtWidgets
from PySide2.QtCharts import QtCharts
def ui_to_window(filename, parent=None):
file = QtCore.QFile(filename)
if not file.open(QtCore.QFile.ReadOnly):
return
loader = QtUiTools.QUiLoader()
window = loader.load(file, parent)
return window
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = ui_to_window("design.ui")
window.widget.setContentsMargins(0, 0, 0, 0)
lay = QtWidgets.QVBoxLayout(window.widget)
lay.setContentsMargins(0, 0, 0, 0)
chartview = QtCharts.QChartView()
chartview.setContentsMargins(0, 0, 0, 0)
lay.addWidget(chartview)
series = QtCharts.QLineSeries()
for i in range(10):
series << QtCore.QPointF(i, random.uniform(0, 10))
# Create Chart and set General Chart setting
chart = QtCharts.QChart()
chart.addSeries(series)
chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations)
# X Axis Settings
axisX = QtCharts.QValueAxis()
chart.addAxis(axisX, QtCore.Qt.AlignBottom)
series.attachAxis(axisX)
# Y Axis Settings
axisY = QtCharts.QValueAxis()
chart.addAxis(axisY, QtCore.Qt.AlignLeft)
series.attachAxis(axisY)
chartview.setChart(chart)
window.show()
sys.exit(app.exec_())
Повышение QChartView:
Если вы все еще хотите использовать метод повышения, вы должны реализовать пользовательский QUiLoader, переопределяющий метод createWidget, возвращая QChartView если имя_класса я s QChartView:
import random
import sys
from PySide2 import QtCore, QtGui, QtUiTools, QtWidgets
from PySide2.QtCharts import QtCharts
class UiLoader(QtUiTools.QUiLoader):
def createWidget(self, className, parent=None, name=""):
if className == "QChartView":
return QtCharts.QChartView(parent)
return super().createWidget(className, parent, name)
def ui_to_window(filename, parent=None):
file = QtCore.QFile(filename)
if not file.open(QtCore.QFile.ReadOnly):
return
loader = UiLoader()
window = loader.load(file, parent)
return window
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = ui_to_window("Pico_LaserCal_MainWindow.ui")
series = QtCharts.QLineSeries()
for i in range(10):
series << QtCore.QPointF(i, random.uniform(0, 10))
# Create Chart and set General Chart setting
chart = QtCharts.QChart()
chart.addSeries(series)
chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations)
# X Axis Settings
axisX = QtCharts.QValueAxis()
chart.addAxis(axisX, QtCore.Qt.AlignBottom)
series.attachAxis(axisX)
# Y Axis Settings
axisY = QtCharts.QValueAxis()
chart.addAxis(axisY, QtCore.Qt.AlignLeft)
series.attachAxis(axisY)
window.calibrationChart.setChart(chart)
window.show()
sys.exit(app.exec_())