将QChartView插入ui
问题内容:
我试图将绘图烛台和5天平均线放在同一张qtchart上,但将两个x轴绘图代码放入UI加载器
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
from PyQt5 import uic
import sys
from PyQt5.QtChart import QCandlestickSeries, QChart, QChartView, QCandlestickSet
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import Qt, QPointF
from PyQt5 import QtChart as qc
# load both ui file
uifile_1 = 'UI/main.ui'
form_1, base_1 = uic.loadUiType(uifile_1)
uifile_2 = 'UI/main1.ui'
form_2, base_2 = uic.loadUiType(uifile_2)
class Example(base_1, form_1):
def __init__(self):
super(base_1, self).__init__()
self.setupUi(self)
self.pushButton_2.clicked.connect(self.change)
def change(self):
self.main = MainPage()
self.main.show()
# self.close()
class MainPage(base_2, form_2):
def __init__(self):
super(base_2, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
我试过放一个小部件,但不知道什么是升级的烛台类名和头文件。
我要执行此操作的原因是,我要定期更新此烛台图,并在该窗口上插入一些按钮。
用户界面
<?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">
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>210</x>
<y>280</y>
<width>88</width>
<height>33</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>340</x>
<y>80</y>
<width>88</width>
<height>33</height>
</rect>
</property>
<property name="text">
<string>Test Trade</string>
</property>
</widget>
<widget class="PlotWidget" name="widget" native="true">
<property name="geometry">
<rect>
<x>140</x>
<y>100</y>
<width>120</width>
<height>80</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>25</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>PlotWidget</class>
<extends>QWidget</extends>
<header>qtgraph</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
问题答案:
尽管它是一个有效的选项,但是不必升级一个类,这样就可以在基于.ui生成的窗口中显示该类,因为您可以使用空的QWidget(不提升它)作为容器,然后放置一个布局,并在布局中添加QChartView。
该图显示了一个空的QWidget,其名称为“ chart_container”,将在其中放置QChartView:
<?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">
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>210</x>
<y>280</y>
<width>88</width>
<height>33</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_2">
<property name="geometry">
<rect>
<x>340</x>
<y>80</y>
<width>88</width>
<height>33</height>
</rect>
</property>
<property name="text">
<string>Test Trade</string>
</property>
</widget>
<widget class="QWidget" name="chart_container" native="true">
<property name="geometry">
<rect>
<x>29</x>
<y>29</y>
<width>291</width>
<height>231</height>
</rect>
</property>
</widget>
</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>
然后通过通过布局将QChartView添加到容器中来实现代码:
import sys
from PyQt5 import QtCore, QtWidgets, uic, QtChart
# load both ui file
uifile_1 = "UI/main.ui"
form_1, base_1 = uic.loadUiType(uifile_1)
class Example(base_1, form_1):
def __init__(self):
super(base_1, self).__init__()
self.setupUi(self)
data = (
(1, 7380, 7520, 7380, 7510, 7324),
(2, 7520, 7580, 7410, 7440, 7372),
(3, 7440, 7650, 7310, 7520, 7434),
(4, 7450, 7640, 7450, 7550, 7480),
(5, 7510, 7590, 7460, 7490, 7502),
(6, 7500, 7590, 7480, 7560, 7512),
(7, 7560, 7830, 7540, 7800, 7584),
)
series = QtChart.QCandlestickSeries()
series.setDecreasingColor(QtCore.Qt.red)
series.setIncreasingColor(QtCore.Qt.green)
ma5 = QtChart.QLineSeries() # 5-days average data line
tm = [] # stores str type data
# in a loop, series and ma5 append corresponding data
for num, o, h, l, c, m in data:
series.append(QtChart.QCandlestickSet(o, h, l, c))
ma5.append(QtCore.QPointF(num, m))
tm.append(str(num))
chart = QtChart.QChart()
chart.addSeries(series) # candle
chart.addSeries(ma5) # ma5 line
chart.setAnimationOptions(QtChart.QChart.SeriesAnimations)
chart.createDefaultAxes()
chart.legend().hide()
chart.axisX(series).setCategories(tm)
chart.axisX(ma5).setVisible(False)
chartview = QtChart.QChartView(chart)
**self.chart_container.setContentsMargins(0, 0, 0, 0)
lay = QtWidgets.QHBoxLayout(self.chart_container)
lay.setContentsMargins(0, 0, 0, 0)
lay.addWidget(chartview)**
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())