Ошибка PyQt: Нет такого сигнала QObject :: dataChanged - PullRequest
0 голосов
/ 26 марта 2010

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

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

В чем причина этого? В программе нет сигнала dataChanged.

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

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

Ответы [ 2 ]

1 голос
/ 26 марта 2010

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

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

0 голосов
/ 26 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...