pyqtSlot und pyqtProperty funktionieren nicht mehr

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
hillwalker
User
Beiträge: 2
Registriert: Sonntag 23. Februar 2014, 09:49

Hallo zusammen,
da dies mein 1. Beitrag in diesem Forum ist, möchte ich alle zuerst grüssen. Nun zur Sache.
Ich habe nach diesem Vorbild (http://pysnippet.blogspot.de/2010/01/ca ... pyqts.html)
ein Script erstellt mit dem ich von JavaScript auf Python zugreifen kann.
Hier die wichtigsten Auszüge aus meinem Script:

Code: Alles auswählen

class classPyConnect(QtCore.QObject):
  @QtCore.pyqtSlot(str, str, int, int)
  def fEditWindow(self, pValue, pHeader, pWidth, pHeight):
    try:
      self.oWebView = QtWebKit.QWebView()
      ...
      ...
    except:
      msgBox = QtGui.QMessageBox()
      msgBox.setText("Beim Initialisieren ist ein Fehler aufgetreten")
      msgBox.show()

  @QtCore.pyqtSlot(str)
  def fMessage(self, pValue):
    QtGui.QMessageBox.information(None, "Info", pValue)
   
  def _pyVersion(self):  
    #Return the Python version.
    return sys.version  
  
  #Python interpreter version property.
  pyVersion = QtCore.pyqtProperty(str, fget=_pyVersion)
Und in der Main-Klasse habe ich natürlich

Code: Alles auswählen

  ......addToJavaScriptWindowObject("clPyConnect", classPyConnect())
hinzugefügt. In JavaScript lautet dann der Aufruf:

Code: Alles auswählen

clPyConnect.fEditWindow("irgendwas", "irgendwas", 20, 20);
Das funtioniert spitzenmässig unter Kubuntu 12.10 mit folgenden Versionen
libqtcore4: 4.8.3
python-qt4: 4.9.3-4
Ich habe nun in einem neuen Rechner Kubuntu 13.10 installiert, dies enthält die Versionen
libqtcore4: 4.8.4
python-qt4: 4.10.3
Seitdem funktionieren die Aufrufe:

Code: Alles auswählen

clPyConnect.fEditWindow("irgendwas", "irgendwas", 20, 20)
clPyConnect.fMessage("irgendetwas");
alert(clPyConnect.pyVersion);
nicht mehr. (fMessage und pyVersion dienen nur zu Testzwecken). Wenn ich nun in JavaScript das Vorhandensein der Objekte prüfe

Code: Alles auswählen

ergebnis = clPyConnect ? true : false;
erhalte ich true.

Code: Alles auswählen

ergebnis = clPyConnect.fEditWindow ? true : false;
ergibt false.
Bei meinen Recherchen bin ich auf folgende Seite gestossen http://srinikom.github.io/pyside-bz-archive/100.html
(Deshalb auch der Test mit pyVersion). Obwohl es hier meiner Meinung nach um eine ältere Version handelt scheint es mein Problem zu betreffen.
Kann es sein, dass dieser Fehler wieder präsent ist?

Ich bin nun mit meinem Latein am Ende und hoffe, dass mir hier jemand weiterhelfen kann, da ich das Script für meine "HTML-App" dringend benötige.
Mit Dank im Voraus, Gruß
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Nur mal zur Rückmeldung: Unter Arch (python-pyqt 4.10.3, qt4 4.8.5) läuft der Quelltext von deinem Link ohne Fehler.
Vielleicht postest du mal ein minimales Beispiel deiner Anwendung, damit man das ggf. prüfen kann.
hillwalker
User
Beiträge: 2
Registriert: Sonntag 23. Februar 2014, 09:49

@EmaNymton danke für die schnelle Antwort.
Hier mein komplettes Python-Script

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import sys
import os
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.QtWebKit import QWebSettings

class classPyConnect(QtCore.QObject):
  @QtCore.pyqtSlot(str, str, int, int)
  def fEditWindow(self, pValue, pHeader, pWidth, pHeight):
    try:
      self.oWebView = QtWebKit.QWebView()
      self.oWebView.load(QtCore.QUrl(pValue))

      self.oWindow = QtGui.QMainWindow()
      self.oWindow.setCentralWidget(self.oWebView)
      self.oWindow.setGeometry(60, 60, pWidth, pHeight)
      self.oWindow.setFixedSize(pWidth, pHeight)

      self.oWindow.setWindowTitle(pHeader)
      self.oWindow.setWindowIcon(QtGui.QIcon("OfficeLogo.png"))
      self.oWindow.show()
    except:
      msgBox = QtGui.QMessageBox()
      msgBox.setText("Beim Initialisieren des Fensters ist ein Fehler aufgetreten")
      msgBox.show()
    #end try/xcept
  #end

  @QtCore.pyqtSlot(str)
  def fMessage(self, pValue):
    QtGui.QMessageBox.information(None, "Info", pValue)
  #end
  
  def _pyVersion(self):  
    #Return the Python version.
    return sys.version  
  #end
  
  #Python interpreter version property.
  pyVersion = QtCore.pyqtProperty(str, fget=_pyVersion)  
  
#end classPyConnect

def main(argv=None):
  if argv is None:
    argv = sys.argv
  #end if
  app = QtGui.QApplication(argv)
  try:
    QtCore.QTextCodec.setCodecForCStrings(QtCore.QTextCodec.codecForLocale())

    vUrl = "http://127.0.0.1/Index.html"
    oWebView = QtWebKit.QWebView()
    oWebView.load(QtCore.QUrl(vUrl))
    oWebView.page().mainFrame().addToJavaScriptWindowObject("clPyConnect", classPyConnect())

    QWebSettings.globalSettings().setAttribute(QWebSettings.JavascriptCanAccessClipboard,True)
    if not QWebSettings.globalSettings().testAttribute(QWebSettings.LocalStorageEnabled,):
      QWebSettings.globalSettings().setAttribute(QWebSettings.LocalStorageEnabled,True)
      QWebSettings.globalSettings().setLocalStoragePath("/.local/share/QtWebkit");

    oWindow = QtGui.QMainWindow()
    oWindow.setCentralWidget(oWebView)
    oWindow.setGeometry(20, 20, 968, 700)
    oWindow.setFixedSize(968, 700)
    oWindow.setWindowTitle("Büroverwaltung")
    oWindow.setWindowIcon(QtGui.QIcon("OfficeLogo.png"))
    oWindow.show()

  except:
    msgBox = QtGui.QMessageBox()
    msgBox.setText("Beim Initialisieren der Anwendung ist ein Fehler aufgetreten")
    msgBox.show()

  sys.exit(app.exec_())
#end main

if __name__ == "__main__":
  main()
#end main
Und dazu die Java-Script-Funktionen

Code: Alles auswählen

function fEditWindow() {
  clPyConnect.fEditWindow("http://127.0.0.1/EditWindow.html", "Bearbeiten", 750, 596);
}//end function

function fSendMessage() {
  clPyConnect.fMessage("TestMessage");
}//end function

function fGetVersion() {
  alert(clPyConnect.pyVersion());
}//end function
Wie schon gesagt in vorigen Versionen hat das prima funktioniert.
Gruß
Antworten