2010-03-26 3 views
0

l'application PyQt fonctionne très bien, mais quand je le ferme Python affiche ce message:erreur PyQt: Aucun signal de QObject :: dataChanged

"Object::connect: No such signal QObject::dataChanged(QModelIndex,QModelIndex)" 

Quelle est la cause de cela? Il n'y a pas de signal dataChanged dans le programme.

EDIT: La MWF démontrer l'erreur:

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtSql import * 
import ui_DBMainWindow 

global Mw, Table 
Id, Name, Size = range(3) 

class TTable(): 
    pass 

Table = TTable() 

class TMainWindow(QMainWindow, ui_DBMainWindow.Ui_MainWindow): 

    def __init__(self, parent = None): 
     global Table 
     QMainWindow.__init__(self, parent) 
     self.setupUi(self) 
     self.showMaximized() 
     self.mapper = QDataWidgetMapper(self) 
     self.mapper.setModel(Table.Model) # if this line is commented out, error disappear 

def main(): 
    global Mw, Table 
    QApp = QApplication(sys.argv) 
    DB = QSqlDatabase.addDatabase("QSQLITE") 
    DB.setDatabaseName("1.db") 
    Table.Model = QSqlTableModel() 
    Table.Model.setTable("MainTable") 
    Table.Model.select() 
    Mw = TMainWindow() 
    QApp.exec_() 

if __name__ == "__main__": 
    main() 

EDIT 2: 1.db est la base de données avec une table MainTable avec 3 domaines: Id (autoincrement clés entier caché), Name (chaîne), Size (entier). Il peut être vide, la même erreur.

fichier

ui_DBMainWindow.py:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'C:\blizzard\Projects\PyQt\DB4\DBMainWindow.ui' 
# 
# Created: Fri Mar 26 22:04:00 2010 
#  by: PyQt4 UI code generator 4.4.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(800, 696) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.TableView = QtGui.QTableView(self.centralwidget) 
     self.TableView.setGeometry(QtCore.QRect(10, 20, 551, 451)) 
     self.TableView.setObjectName("TableView") 
     self.btAdd = QtGui.QPushButton(self.centralwidget) 
     self.btAdd.setGeometry(QtCore.QRect(570, 20, 91, 24)) 
     self.btAdd.setObjectName("btAdd") 
     self.btDel = QtGui.QPushButton(self.centralwidget) 
     self.btDel.setGeometry(QtCore.QRect(570, 80, 91, 24)) 
     self.btDel.setObjectName("btDel") 
     self.btEdit = QtGui.QPushButton(self.centralwidget) 
     self.btEdit.setGeometry(QtCore.QRect(570, 50, 91, 24)) 
     self.btEdit.setObjectName("btEdit") 
     self.leQueryError = QtGui.QLineEdit(self.centralwidget) 
     self.leQueryError.setGeometry(QtCore.QRect(10, 550, 551, 20)) 
     self.leQueryError.setObjectName("leQueryError") 
     self.btQuery = QtGui.QPushButton(self.centralwidget) 
     self.btQuery.setGeometry(QtCore.QRect(570, 480, 75, 24)) 
     self.btQuery.setObjectName("btQuery") 
     self.teQuery = QtGui.QTextEdit(self.centralwidget) 
     self.teQuery.setGeometry(QtCore.QRect(10, 480, 551, 64)) 
     self.teQuery.setObjectName("teQuery") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 19)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "База данных", None, QtGui.QApplication.UnicodeUTF8)) 
     self.btAdd.setText(QtGui.QApplication.translate("MainWindow", "Добавить", None, QtGui.QApplication.UnicodeUTF8)) 
     self.btDel.setText(QtGui.QApplication.translate("MainWindow", "Удалить", None, QtGui.QApplication.UnicodeUTF8)) 
     self.btEdit.setText(QtGui.QApplication.translate("MainWindow", "Редактировать", None, QtGui.QApplication.UnicodeUTF8)) 
     self.btQuery.setText(QtGui.QApplication.translate("MainWindow", "Запрос", None, QtGui.QApplication.UnicodeUTF8)) 
+1

Fournir un exemple complet, s'il vous plaît, ce script ne contient pas ui_DBMainWindow et des références à 1.db. Qu'est-ce que ça devrait être? –

Répondre

0

L'une des méthodes que vous appelez essaie de se connecter une fente à un signal nommé dataChanged sur un QObject, qui n'émet évidemment pas un tel signal. Comme il n'y a pas de signal dataChanged dans votre programme, il y a de fortes chances qu'une méthode essaie de le faire indirectement. En outre, comme cela se produit lorsque vous fermez votre programme, je regarderais d'abord le code qui est exécuté lorsque l'interpréteur s'arrête (c'est-à-dire les destructeurs et autres).

1

pouvez-vous fournir du code à partir de votre application? Y a-t-il des instances des types suivants ou de leurs descendants? QAbstractItemModel, QAbstractItemView, par exemple QListView, QTreeView et ainsi de suite. Essayez d'attraper tous les endroits, où vous connectez quelque chose à ceux, pas spécialement à ce signal. Vous devez regarder, quand ces types descendant instancié dans votre code émettent dataChanged, Dieu merci, Qt est opensource. Il semble que votre application pense que certains objets sont QAbstractItemModel ou QAbstractItemView descendant, si ce n'est pas le cas, et essaie de connecter un slot à son signal dataChanged.

PS. Lorsque vous compilez une interface par uic, la classe résultante hérite de object, et non de QtGui.QMainWindow ou de smth. Peut-être que c'est en quelque sorte lié.