Найти - Пользователи
Полная версия: PyQt4 проблема с SIGNAL/SLOT
Начало » GUI » PyQt4 проблема с SIGNAL/SLOT
1
Sturmvogel
Доброго времени суток.
Недавно начал разбираться с PyQt4, и у меня возникла довольно странная проблема.
Есть вот такой код:
QtCore.QObject.connect(myclass.mnuExit, QtCore.SIGNAL("activated()"),quit())
Программа запускается, но вместо того, чтобы функция quit() срабатывала при нажатии на пункт меню mnuExit, она выполняется сразу.

Полный код:
модуль frmMain.py (преобразован из *ui файла)
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'frmMain.ui'
#
# Created: Tue Jul 6 19:30:01 2010
# by: PyQt4 UI code generator 4.7.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_frmMain(object):
def setupUi(self, frmMain):
frmMain.setObjectName("frmMain")
frmMain.resize(531, 361)
self.centralwidget = QtGui.QWidget(frmMain)
self.centralwidget.setObjectName("centralwidget")
frmMain.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(frmMain)
self.menubar.setGeometry(QtCore.QRect(0, 0, 531, 21))
self.menubar.setObjectName("menubar")
self.mnuMsg = QtGui.QMenu(self.menubar)
self.mnuMsg.setObjectName("mnuMsg")
self.mnuFile = QtGui.QMenu(self.menubar)
self.mnuFile.setObjectName("mnuFile")
frmMain.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(frmMain)
self.statusbar.setObjectName("statusbar")
frmMain.setStatusBar(self.statusbar)
self.mnuExit = QtGui.QAction(frmMain)
self.mnuExit.setObjectName("mnuExit")
self.mnuHello = QtGui.QAction(frmMain)
self.mnuHello.setObjectName("mnuHello")
self.mnuBye = QtGui.QAction(frmMain)
self.mnuBye.setObjectName("mnuBye")
self.mnuMsg.addAction(self.mnuHello)
self.mnuMsg.addAction(self.mnuBye)
self.mnuFile.addAction(self.mnuExit)
self.menubar.addAction(self.mnuFile.menuAction())
self.menubar.addAction(self.mnuMsg.menuAction())

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

def retranslateUi(self, frmMain):
frmMain.setWindowTitle(QtGui.QApplication.translate("frmMain", "Проверка PyQt4", None, QtGui.QApplication.UnicodeUTF8))
self.mnuMsg.setTitle(QtGui.QApplication.translate("frmMain", "Сообщения", None, QtGui.QApplication.UnicodeUTF8))
self.mnuFile.setTitle(QtGui.QApplication.translate("frmMain", "Файл", None, QtGui.QApplication.UnicodeUTF8))
self.mnuExit.setText(QtGui.QApplication.translate("frmMain", "Выход", None, QtGui.QApplication.UnicodeUTF8))
self.mnuHello.setText(QtGui.QApplication.translate("frmMain", "Приветствие", None, QtGui.QApplication.UnicodeUTF8))
self.mnuBye.setText(QtGui.QApplication.translate("frmMain", "Поздравление", None, QtGui.QApplication.UnicodeUTF8))
главный модуль main.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# To change this template, choose Tools | Templates
# and open the template in the editor.

__author__="sturmvogel"
__date__ ="$6.7.2010 16.48.04$"

import frmMain
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtCore

class MyClass(QMainWindow,
frmMain.Ui_frmMain):

def __init__(self, parent=None):
super(MyClass, self).__init__(parent)
self.setupUi(self)

def main():
app = QApplication(sys.argv)
myclass = MyClass()
QtCore.QObject.connect(myclass.mnuExit, QtCore.SIGNAL("activated()"),quit())
myclass.show()
app.exec_()

if __name__ == "__main__":
main()
apologize828
вместо этого:
QtCore.QObject.connect(myclass.mnuExit, QtCore.SIGNAL("activated()"),quit())
пиши так:
myclass.mnuExit.triggered.connect(quit)
ZZZ
apologize828, ты безусловно прав… Но стоило пару слов написать об ошибке…

Sturmvogel, в своём коде ты передаёшь то, что возвращяет функция. Т.е. ты её _вызываешь_. А надо передать саму функцию.
Sturmvogel
Спасибо, заработало.
Хотя всё-равно странно, даже если я соединяю сигналы и слоты в Qt дизайнере, то всё равно при конвертации *ui->*py сгенерированные функциии работают так же, как и в моём коде
apologize828
Sturmvogel
Спасибо, заработало.
Хотя всё-равно странно, даже если я соединяю сигналы и слоты в Qt дизайнере, то всё равно при конвертации *ui->*py сгенерированные функциии работают так же, как и в моём коде
Не может такого быть!
Вот сделал в дизайнере и соединил(все работает):
файл m.py из дизайнера
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'm.ui'
#
# Created: Thu Jul 08 00:18:19 2010
# by: PyQt4 UI code generator 4.7
#
# 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, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 20))
self.menubar.setObjectName("menubar")
self.menu = QtGui.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action = QtGui.QAction(MainWindow)
self.action.setObjectName("action")
self.menu.addAction(self.action)
self.menubar.addAction(self.menu.menuAction())

self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.menubar, QtCore.SIGNAL("triggered(QAction*)"), MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.menu.setTitle(QtGui.QApplication.translate("MainWindow", "Файл", None, QtGui.QApplication.UnicodeUTF8))
self.action.setText(QtGui.QApplication.translate("MainWindow", "Выход", None, QtGui.QApplication.UnicodeUTF8))
файл m1.py главный
# -*- coding: utf-8 -*-
from PyQt4 import QtGui
from m import Ui_MainWindow

class My_Class(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui=Ui_MainWindow()
self.ui.setupUi(self)

if __name__=='__main__':
import sys
app=QtGui.QApplication(sys.argv)
f=My_Class()
f.show()
app.exec_()
Что-то вы не то наверное соединили.
P.S. Там же в дизайнере есть Форма->Предпросмотр, где можно посмотреть как будет работать сигнал-слот.
Sturmvogel
Странно, но вместо этого кода
QtCore.QObject.connect(self.menubar, QtCore.SIGNAL("triggered(QAction*)"), MainWindow.close)
дизайнер сгенерировал вот это:
QtCore.QObject.connect(self.mnuExit, QtCore.SIGNAL("activated()"), self.centralwidget.close)
О, всё, разобрался
Это я в дизайнере накосячил
Всем спасибо за помощь
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB