2010-03-26 57 views
0

PyQt的应用程序工作正常,但是当我关闭它的Python显示了这个消息:PyQt的错误:没有这样的信号的QObject :: dataChanged

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

是什么原因呢?程序中没有dataChanged信号。

编辑: 的MWE演示错误:

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() 

编辑2:1.db是数据库表MainTable与3个字段:Id(自动增量隐藏整数键),Name(字符串),Size(整数)。它可以是空的,同样的错误。

文件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

请提供完整的示例,此脚本不包含ui_DBMainWindow并引用1.db.它应该是什么? – 2010-03-28 10:35:19

回答

0

一个您呼叫尝试插槽连接到一个名为QObject信号dataChanged,这显然不发出这样一个信号的方法。由于程序中没有dataChanged信号,因此某些方法可能会尝试间接执行此操作。另外,因为它是在关闭程序时发生的,所以我首先会看解释器关闭时执行的代码(即析构函数等)。

1

你能提供一些来自你的应用程序的代码吗? 是否有下列类型的任何实例或它们的后代? QAbstractItemModelQAbstractItemView,例如QListView,QTreeView等等。尝试捕捉任何地方,将某些东西连接到某个地方,而不是特别关注该信号。你需要看看,当代码中的这些后代类型发出dataChanged时,感谢上帝,Qt是开源的。 看来,您的应用程序认为,某个对象是QAbstractItemModel或QAbstractItemView后代,不管它是否并尝试将一个插槽连接到其信号。

PS。当你用uic编译某个接口时,结果类继承自object,而不是QtGui.QMainWindow或者smth。也许它有某种相关性。