Ошибка PyQt: нет такого сигнала QObject::dataChanged

Приложение PyQt работает нормально, но когда я его закрываю, Python показывает это сообщение:

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

person DSblizzard    schedule 26.03.2010    source источник
comment
Приведите полный пример, пожалуйста, этот скрипт не содержит ui_DBMainWindow и ссылок на 1.db. Что это должно быть?   -  person Maxim Popravko    schedule 28.03.2010


Ответы (2)


Можете ли вы предоставить код из вашего приложения? есть ли в нем экземпляры следующих типов или их потомков? QAbstractItemModel, QAbstractItemView, например QListView, QTreeView и так далее. Старайтесь ловить любые места, где вы что-то подключаете к единицам, не особенно к этому сигналу. Вам нужно посмотреть, когда эти типы-потомки, экземпляры которых в вашем коде, испускают dataChanged, слава богу, Qt с открытым исходным кодом. Похоже, ваше приложение думает, что какой-то объект является потомком QAbstractItemModel или QAbstractItemView, таковым не является, и пытается подключить слот к его сигналу dataChanged.

PS. Когда вы компилируете какой-либо интерфейс с помощью uic, результирующий класс наследуется от object, а не от QtGui.QMainWindow или чего-то еще. Может быть, это как-то связано.

person Maxim Popravko    schedule 26.03.2010

Один из методов, которые вы вызываете, пытается подключить слот к сигналу с именем dataChanged на QObject, который, очевидно, не испускает такой сигнал. Поскольку в вашей программе нет сигнала dataChanged, есть вероятность, что какой-то метод попытается сделать это косвенно. Кроме того, поскольку это происходит, когда вы закрываете свою программу, я бы сначала посмотрел код, который выполняется при завершении работы интерпретатора (т.е. деструкторы и тому подобное).

person Tamás    schedule 26.03.2010