Название: Автодисконнект сигнала после выполнения
Отправлено: kazak1377 от Апрель 21, 2013, 13:10
Добрый день. Пишу программку-викторину. Хочу реализовать переходы по вопросам, но окно программы у меня одно, и кнопку тоже одни, в итоге после пару нажатий сигналы вызывают все подряд. Руками не дисконектится. Пишу на PyQt4. Но если вы подскажите как в обычном Qt автоматом дисконнектить, думаю на PyQt я переведу. вот код: Python #!/usr/bin/python # -*- coding: utf-8 -*- import string from os import system from PyQt4 import QtCore,QtGui, uic #### не забудь при вызове одной функции ставить фолсы на все остальные name = u'00000000' isOkConnecked=[False]*4 isPrevConnecked=[False]*4 class MainWindow(QtGui.QWidget): def __init__(self, parent = None): QtGui.QWidget.__init__(self,parent) Form, base=uic.loadUiType("MyUi.ui") self.ui=Form() self.ui.setupUi(self) ################################# self.setWindowTitle(u"Эрудит") self.setWindowIcon(QtGui.QIcon('/usr/share/icons/unity-icon-theme/apps/128/work.svg')) self.ui.Pic.hide() self.ui.time.hide() self.ui.ans_a.hide() self.ui.ans_b.hide() self.ui.ans_c.hide() self.ui.bar.hide() self.ui.prev.hide() #self.ui.debug.hide() self.ui.ok.setDisabled(True) h1 = u'Это программа-тестер. Узнайте насколько вы хороший эрудит.' h2=h1+u'<br>Введите свое имя, чтобы приступить к тесту' hello = u'<center><b>'+h2+u"</b></center>" self.ui.ask.setText(hello) self.ui.skip.setText(u"Ввести имя") self.ui.ok.setText(u"Начать") self.ui.skip.clicked.connect(self.sName) self.ui.debug.clicked.connect(self.debug) self.ui.ans_a.clicked.connect(self.onlya) self.ui.ans_b.clicked.connect(self.onlyb) self.ui.ans_c.clicked.connect(self.onlyc) ################################# def debug(self): print 'isOkConnecked',isOkConnecked print 'isPrevConnecked',isPrevConnecked def onlya(self): self.ui.ans_b.setChecked(False) self.ui.ans_c.setChecked(False) def onlyb(self): self.ui.ans_a.setChecked(False) self.ui.ans_c.setChecked(False) def onlyc(self): self.ui.ans_b.setChecked(False) self.ui.ans_a.setChecked(False) def sName(self): global isPrevConnecked,isOkConnecked,name text, ok= QtGui.QInputDialog.getText(self, u'Имя',u'Введите Ваше имя:') if ok and not text.isEmpty(): self.ui.ok.setDisabled(False) name =text self.ui.ok.clicked.connect(self.goq1) isOkConnecked[0]=True def goq1(self): global isPrevConnecked,isOkConnecked if isOkConnecked[0] or isPrevConnecked[0]: self.debug self.q1() isOkConnecked[0]=False isPrevConnecked[0]=False def goq2(self): global isPrevConnecked,isOkConnecked if isOkConnecked[1] or isPrevConnecked[1]: self.debug self.q2() isOkConnecked[1]=False isPrevConnecked[1]=False def goq3(self): global isPrevConnecked,isOkConnecked if isOkConnecked[2] or isPrevConnecked[2]: self.debug self.q3() isOkConnecked[2]=False isPrevConnecked[2]=False def goq4(self): global isPrevConnecked,isOkConnecked if isOkConnecked[3] or isPrevConnecked[3]: self.debug self.q4() isOkConnecked[3]=False isPrevConnecked[3]=False def q1(self): global isPrevConnecked,isOkConnecked print 'q1' string=u'<center><b>Где находится это сооружение?<b></center>' self.setAskUi(string,u"В Барселоне",u"В Киеве",u"В Париже","1.jpg",1) self.ui.ok.clicked.connect(self.goq2) isOkConnecked[1]=True def q2(self): global isPrevConnecked,isOkConnecked print 'q2' string = u'<center><b>Какая фамилия этого поэта?<b></center>' self.setAskUi(string,u"Грибоедов",u"Пушкин",u"Гоголь","2.jpg",2) self.ui.prev.clicked.connect(self.goq1) isPrevConnecked[0]=True self.ui.ok.clicked.connect(self.goq3) isOkConnecked[2]=True def q3(self): global isPrevConnecked,isOkConnecked print 'q3' string = u'<center><b>Как называется это<br>природное явление?<b></center>' self.setAskUi(string,u"Лавина",u"Торнадо",u"Сель","3.jpg",3) self.ui.prev.clicked.connect(self.goq2) isPrevConnecked[1]=True self.ui.ok.clicked.connect(self.goq4) isOkConnecked[3]=True def q4(self): global isPrevConnecked,isOkConnecked print 'q4' string = u'<center><b>Кто вывел эту формулу?<b></center>' self.setAskUi(string,u"Ницше",u"Ленин",u"Энштейн","4.jpg",4) self.ui.prev.clicked.connect(self.goq3) isPrevConnecked[2]=True def setAskUi(self,text,aa,ab,ac,img,i): self.ui.skip.setText(u'Пропустить') self.ui.ok.setText(u'Ответить') self.ui.bar.show() self.ui.ans_a.show() self.ui.ans_b.show() self.ui.ans_c.show() self.ui.prev.show() if i == 1: self.ui.prev.setDisabled(True) else: self.ui.prev.setDisabled(False) if i ==15: self.ui.ok.setText(u'Завершить') self.ui.Pic.show() self.ui.skip.show() self.ui.ok.show() self.ui.bar.setValue(i) askStr = u'<center><b>'+text+'<b></center>' self.ui.ask.setText(askStr) self.ui.ans_a.setText(aa) self.ui.ans_b.setText(ab) self.ui.ans_c.setText(ac) self.scene = QtGui.QGraphicsScene() self.scene.addPixmap(QtGui.QPixmap(img)) self.ui.Pic.setScene(self.scene) self.ui.Pic.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.ui.Pic.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) win=MainWindow() win.show() sys.exit(app.exec_())
ну и MyUi.ui: XML <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Form</class> <widget class="QWidget" name="Form"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>618</width> <height>382</height> </rect> </property> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>618</width> <height>382</height> </size> </property> <property name="maximumSize"> <size> <width>618</width> <height>382</height> </size> </property> <property name="windowTitle"> <string>Form</string> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QGraphicsView" name="Pic"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize"> <size> <width>200</width> <height>200</height> </size> </property> <property name="maximumSize"> <size> <width>200</width> <height>200</height> </size> </property> </widget> </item> <item> <widget class="QLabel" name="ask"> <property name="minimumSize"> <size> <width>300</width> <height>0</height> </size> </property> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QLabel" name="time"> <property name="text"> <string>TextLabel</string> </property> </widget> </item> <item> <spacer name="verticalSpacer"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>20</width> <height>40</height> </size> </property> </spacer> </item> </layout> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <layout class="QVBoxLayout" name="box"> <item> <widget class="QCheckBox" name="ans_a"> <property name="text"> <string>CheckBox</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="ans_b"> <property name="text"> <string>CheckBox</string> </property> </widget> </item> <item> <widget class="QCheckBox" name="ans_c"> <property name="text"> <string>CheckBox</string> </property> </widget> </item> </layout> </item> <item> <spacer name="horizontalSpacer_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <widget class="QProgressBar" name="bar"> <property name="minimum"> <number>0</number> </property> <property name="maximum"> <number>4</number> </property> <property name="value"> <number>1</number> </property> <property name="format"> <string>%v/%m</string> </property> </widget> </item> <item> <widget class="QPushButton" name="debug"> <property name="text"> <string>debug</string> </property> </widget> </item> </layout> </item> <item> <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> <widget class="QPushButton" name="prev"> <property name="text"> <string>Предыдущий</string> </property> </widget> </item> <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> <property name="sizeHint" stdset="0"> <size> <width>40</width> <height>20</height> </size> </property> </spacer> </item> <item> <widget class="QPushButton" name="skip"> <property name="text"> <string>Пропустить</string> </property> </widget> </item> <item> <widget class="QPushButton" name="ok"> <property name="text"> <string>Ответить</string> </property> </widget> </item> </layout> </item> </layout> </widget> <tabstops> <tabstop>ok</tabstop> <tabstop>Pic</tabstop> </tabstops> <resources/> <connections/> <designerdata> <property name="gridDeltaX"> <number>10</number> </property> <property name="gridDeltaY"> <number>10</number> </property> <property name="gridSnapX"> <bool>true</bool> </property> <property name="gridSnapY"> <bool>true</bool> </property> <property name="gridVisible"> <bool>true</bool> </property> </designerdata> </ui>
В коде просто русский текст, того оно так и отобразило на форуме.
Название: Re: Автодисконнект сигнала после выполнения
Отправлено: Bepec от Апрель 21, 2013, 13:18
Незнаю особенностей pyQt, но обычный disconnect убивает все соединения.
Название: Re: Автодисконнект сигнала после выполнения
Отправлено: gil9red от Апрель 21, 2013, 14:38
При удалении класса, автоматически прерываются все connect'ы этого класса :) Но никто не запрещает вручную вызвать disconnect ;)
Название: Re: Автодисконнект сигнала после выполнения
Отправлено: kazak1377 от Апрель 21, 2013, 17:21
Ну у меня обычный дисконект возвращает фолс!(((
Название: Re: Автодисконнект сигнала после выполнения
Отправлено: Bepec от Апрель 21, 2013, 17:43
А ты напиши как применяешь ) Мож у тя ошибка где нить :D
|