Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PySide控制qmlui?_Python_Qml_Pyside - Fatal编程技术网

Python 如何使用PySide控制qmlui?

Python 如何使用PySide控制qmlui?,python,qml,pyside,Python,Qml,Pyside,我尝试创建QML-PYSIDE计算器。但是我找不到这样的例子。我还检查了pyside wiki,但不明白如何一起运行QML pyside。 例如,我想用QML PySİde(a+b=c)运行加法应用程序。我可以控制QtDesigner使用Python(由PySideTools转换)创建的添加应用程序GUI(sumui.ui)。但我无法用Python控制添加应用程序QML(inputtext,button)。 我对pythonqt不熟悉。因此,我键入pyside qtdesigner和qml GU

我尝试创建QML-PYSIDE计算器。但是我找不到这样的例子。我还检查了pyside wiki,但不明白如何一起运行QML pyside。 例如,我想用QML PySİde(a+b=c)运行加法应用程序。我可以控制QtDesigner使用Python(由PySideTools转换)创建的添加应用程序GUI(sumui.ui)。但我无法用Python控制添加应用程序QML(inputtext,button)。 我对pythonqt不熟悉。因此,我键入pyside qtdesigner和qml GUI,以了解pyside QtWidgets和pyside qml UI之间的关系。(对不起,我的英语不好)

PySide添加应用程序:

应用程序图片:

addition.py:

# addition.py
from PySide import QtCore, QtGui
from sumui import Ui_Form
import sys

def derece(degrees):
    return degrees*((2*pi)/400)
class hesap(QtGui.QWidget):
    def __init__(self):
      QtGui.QWidget.__init__(self)

      self.ui = Ui_Form()
      self.ui.setupUi(self)

      # Validations
      tempValidator = QtGui.QDoubleValidator()
      tempValidator.setNotation(QtGui.QDoubleValidator.StandardNotation)
      self.ui.a.setValidator(tempValidator)
      self.ui.b.setValidator(tempValidator)
      self.setupConnections()

    def topla(self):
        a1 = float(self.ui.a.text())
        b1 = float(self.ui.b.text())
        c1 = a1 + b1
        cc1 = str(c1)
        self.ui.c.setText(str(cc1))



    def setupConnections(self):
        self.connect(self.ui.sum, QtCore.SIGNAL('clicked()'),
          self.topla)
if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    window = hesap()
    window.show()
    sys.exit(app.exec_())
QML图形用户界面: addition.qml:

import QtQuick 1.1
Rectangle {
    id:r
    anchors.centerIn: parent
    width: 200
    height: 200
    Column{
        width: r.width*0.8
        height: r.height*0.8
        spacing: 10
        anchors.centerIn: parent
        Row{
            id:ro
            spacing:10
            Text {
                anchors.centerIn: ro.parent
                font.bold: true
                text: "a"
            }
            TextInput {
                id: a
                width: r.width*3/4
                height: 20
                selectionColor: "#2f8bc5"
                fillColor: "lightgray"
                font.bold: true
            }
        }
        Row{
            spacing:10
        Text {
            text: "b"
            font.bold: true
        }
        TextInput {
            id: b
            width: r.width*3/4
            height: 20
            fillColor: "lightgray"
            font.bold: true
        }
        }
        Rectangle {
            id: calculate
            width: r.width
            height: 30
            color: "#8a0800"
            //x:b.width*0.2
            Text{
                anchors.centerIn: calculate
                font.bold: true
                text:"calculate";color:"white"}
                gradient: Gradient {
                GradientStop {
                    position: 0
                    color: "#8a0800"
                }
                GradientStop {
                    position: 1
                    color: "#330009"
                }
            }
        }

        Row{
            spacing:10
        Text {
            text: "c"
            font.bold: true
        }
        TextInput {
            id: c
            font.bold: true
            width: r.width*3/4
            height: 20
            fillColor: "lightgray"
            selectionColor: "#2f8bc5"
            font.pixelSize: 12
        }
        }
    }
}
如何使用PySide运行QML添加UI?或者有类似PySide QML计算器的例子吗?
谢谢

那么您想在QML GUI上显示pyside方法的结果吗? 现在您有了两个UI:Qt小部件和QML。我认为您希望从pyside应用程序(仅QML UI)控制QML gui。 首先,您必须从pyside()加载qml文件。第二件事是信号和插槽()。
您的计算按钮应向pyside层发出带有a和b变量的信号,pyside层应该有用于该信号的插槽,该插槽将计算变量并向qml插槽发送信号,qml插槽将在qml ui中显示该结果。

以下是一个界面示例,当您单击按钮时,该界面将更新分数。它的设计可能不需要与python进行太多的交互,但在许多情况下,我们希望信号传递给python,不管接口层有多么天才

import sys
from PySide import QtCore,QtDeclarative, QtGui

class QtScoreInterface(QtCore.QObject ):

    signaller_score_a = QtCore.Signal(str)
    signaller_score_b = QtCore.Signal(str)


    def __init__(self):
        QtCore.QObject.__init__(self)
        self.score_a = 0
        self.score_b = 0

    @QtCore.Slot()
    def aScored(self):
        print ("A_scored");
        self.score_a += 1
        self.updateScore()


    @QtCore.Slot()
    def bScored(self):
        print ("B_scored");
        self.score_b += 1
        self.updateScore()


    @QtCore.Slot()
    def startMatch(self):
        print ("Game start stopped");


    def updateScore(self):
        self.signaller_score_a.emit(str(self.score_a))
        self.signaller_score_b.emit(str(self.score_b))


class MainView( QtDeclarative.QDeclarativeView ):
    def __init__( self, parent=None):
        super( MainView, self ).__init__( parent )
        self.setWindowTitle( "ScoreKeeper" )
        self.setSource( QtCore.QUrl.fromLocalFile( './main.qml' ) )
        self.setResizeMode( QtDeclarative.QDeclarativeView.SizeRootObjectToView )


qApplication = QtGui.QApplication( sys.argv )
window = MainView()
window.show();

qcontext = window.rootContext() 
interface = QtScoreInterface()
qcontext.setContextProperty("qScoreInterface",interface)

interface.signaller_score_a.connect(window.rootObject().updateScoreA)
interface.signaller_score_b.connect(window.rootObject().updateScoreB)

sys.exit( qApplication.exec_() )
以下是QML文件(main.QML):


非常感谢。是的,我是那个意思。我可以用python运行单个QML。但是我没有尝试用python运行多个QML文件。我将尝试运行多QML。这是一个很好的研究C++ + QT的例子,我对C++一无所知。但是我将研究C++和PyQt之间的相似例子。然后我将比较它们的控制信号和插槽。因此,PyScand和C++使用QT相同的API。对不起,我的英语不好。谢谢。这是Python理解控件QML的一个很好的例子。有这样一个解决方案:testqml.QML:main.py:问题是它不能使用任何buton进行计算。它与enter键一起工作。我想使用“QObjectName”控制QML对象。因为计算的参数很多。
import QtQuick 1.1

Rectangle {
    id: rectangle1
    width: 480
    height: 272



    gradient: Gradient {
        GradientStop {
            id: gradientStop1
            position: 0
            color: "#ffffff"
        }

        GradientStop {
            position: 1
            color: "#abc09f"
        }
    }

    function updateScoreA(string ) {
        score_a.text = string
    }

    function updateScoreB(string ) {
        score_b.text = string
    }

    Text {
        id: score_a
        x: 45
        y: 8
        width: 131
        height: 48
        text: qsTr("Text")
        verticalAlignment: Text.AlignVCenter
        font.pixelSize: 12
    }

    Text {
        id: score_b
        x: 303
        y: 8
        width: 131
        height: 48
        text: qsTr("Text")
        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignRight
        font.pixelSize: 12




    }

    Text {
        id: dash
        x: 232
        y: 5
        text: qsTr("-")
        horizontalAlignment: Text.AlignHCenter
        font.pixelSize: 47
    }

    MouseArea {
        id: a_scored
        x: 303
        y: 200
    }

    Rectangle {
        id: team_a
        x: 45
        y: 218
        width: 127
        height: 46
        color: "#4e3a3a"
        radius: 10

        TextInput {
            id: team_a_txt
            x: 24
            y: 13
            width: 80
            height: 20
            text: qsTr("A")
            horizontalAlignment: TextInput.AlignHCenter
            font.pixelSize: 12
        }

        MouseArea {
            id: team_a_score_ma
            x: 0
            y: 0
            width: 126
            height: 46
            onClicked: {
                qScoreInterface.aScored()
            }
        }
    }

    Rectangle {
        id: team_b
        x: 307
        y: 218
        width: 127
        height: 46
        color: "#4e3a3a"
        radius: 10
        TextInput {
            id: team_b_txt
            x: 24
            y: 13
            width: 80
            height: 20
            text: qsTr("B")
            horizontalAlignment: TextInput.AlignHCenter
            font.pixelSize: 12
        }

        MouseArea {
            id: team_b_score_ma
            x: 0
            y: 0
            width: 126
            height: 46
            onClicked: {
                qScoreInterface.bScored()
            }
        }
    }

    Rectangle {
        id: startstopgame
        x: 177
        y: 113
        width: 127
        height: 46
        color: "#4e3a3a"
        radius: 10
        TextInput {
            id: startstopgame_txt
            x: 24
            y: 13
            width: 80
            height: 20
            text: qsTr("Start Game")
            horizontalAlignment: TextInput.AlignHCenter
            font.pixelSize: 12
        }

        MouseArea {
            id: startstopgame_ma
            x: 1
            y: 0
            width: 126
            height: 46
            onClicked: {
                qScoreInterface.startMatch()
            }
        }
    }

}