【发布时间】:2018-12-22 01:10:07
【问题描述】:
我编写了一个简单的 pyqt5+qml 应用程序来绘制函数图。我试图在单击按钮时更改画布的背景颜色,但没有任何反应,这是代码。
main.py
>from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot
class Plot(QObject):
def __init__(self):
QObject.__init__(self)
updCanv = pyqtSignal(arguments=['upd'])
@pyqtSlot()
def upd(self):
self.updCanv.emit()
if __name__ == "__main__":
import sys
# Create an instance of the application
sys.argv += ['--style', 'material']
app = QGuiApplication(sys.argv)
# Create QML engine
engine = QQmlApplicationEngine()
# Create a plot object
plot = Plot()
# And register it in the context of QML
engine.rootContext().setContextProperty("plot", plot)
# Load the qml file into the engine
engine.load("main.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
main.qml
import QtQuick 2.0
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.2
ApplicationWindow {
visible: true
width: 640
height: 240
title: qsTr("Function plot")
Material.theme: Material.Dark
GridLayout {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: 9
columns: 4
rows: 4
rowSpacing: 10
columnSpacing: 10
Text {
color: "whitesmoke"
text: qsTr("Left bound")
}
TextField {
id: left_bound
}
Text {
color: "whitesmoke"
text: qsTr("Right bound")
}
TextField {
id: right_bound
}
ComboBox{
model: ['cos', 'sin', 'x^2']
}
Button {
height: 40
Layout.fillWidth: true
text: qsTr("Build plot")
onClicked: {
plot.upd(left_bound.text, right_bound.text)
}
}
Canvas {
id: canv
Layout.fillWidth: true
height: 500
Layout.columnSpan: 4
onPaint: {
var ctx = getContext("2d");
ctx.fillStyle = Qt.rgba(1, 1, 1, 1);
ctx.fillRect(0, 0, width, height);
}
}
}
Connections {
target: plot
onUpdCanv: {
onPaint: {
var ct = canv.getContext("2d");
ct.fillStyle = Qt.rgba(0, 0, 1, 1);
ct.fillRect(0, 0, width, height);
canv.requestPaint();
}
}
}
}
我能用它做什么?当我想更改绘图或选择另一个功能来显示时如何更新画布,我还需要添加功能来缩小/缩小绘图,是否可以使用 Canvas 对象?
谢谢!
【问题讨论】:
标签: python canvas pyqt qml pyqt5