Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kazak1377 от Апрель 21, 2013, 13:10



Название: Автодисконнект сигнала после выполнения
Отправлено: 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>&#1042;&#1074;&#1077;&#1076;&#1080;&#1090;&#1077; &#1089;&#1074;&#1086;&#1077; &#1080;&#1084;&#1103;, &#1095;&#1090;&#1086;&#1073;&#1099; &#1087;&#1088;&#1080;&#1089;&#1090;&#1091;&#1087;&#1080;&#1090;&#1100; &#1082; &#1090;&#1077;&#1089;&#1090;&#1091;'
hello = u'<center><b>'+h2+u"</b></center>"
self.ui.ask.setText(hello)
self.ui.skip.setText(u"&#1042;&#1074;&#1077;&#1089;&#1090;&#1080; &#1080;&#1084;&#1103;")
self.ui.ok.setText(u"&#1053;&#1072;&#1095;&#1072;&#1090;&#1100;")
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'&#1048;&#1084;&#1103;',u'&#1042;&#1074;&#1077;&#1076;&#1080;&#1090;&#1077; &#1042;&#1072;&#1096;&#1077; &#1080;&#1084;&#1103;:')
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>&#1043;&#1076;&#1077; &#1085;&#1072;&#1093;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1101;&#1090;&#1086; &#1089;&#1086;&#1086;&#1088;&#1091;&#1078;&#1077;&#1085;&#1080;&#1077;?<b></center>'
self.setAskUi(string,u"&#1042; &#1041;&#1072;&#1088;&#1089;&#1077;&#1083;&#1086;&#1085;&#1077;",u"&#1042; &#1050;&#1080;&#1077;&#1074;&#1077;",u"&#1042; &#1055;&#1072;&#1088;&#1080;&#1078;&#1077;","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>&#1050;&#1072;&#1082;&#1072;&#1103; &#1092;&#1072;&#1084;&#1080;&#1083;&#1080;&#1103; &#1101;&#1090;&#1086;&#1075;&#1086; &#1087;&#1086;&#1101;&#1090;&#1072;?<b></center>'
self.setAskUi(string,u"&#1043;&#1088;&#1080;&#1073;&#1086;&#1077;&#1076;&#1086;&#1074;",u"&#1055;&#1091;&#1096;&#1082;&#1080;&#1085;",u"&#1043;&#1086;&#1075;&#1086;&#1083;&#1100;","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>&#1050;&#1072;&#1082; &#1085;&#1072;&#1079;&#1099;&#1074;&#1072;&#1077;&#1090;&#1089;&#1103; &#1101;&#1090;&#1086;<br>&#1087;&#1088;&#1080;&#1088;&#1086;&#1076;&#1085;&#1086;&#1077; &#1103;&#1074;&#1083;&#1077;&#1085;&#1080;&#1077;?<b></center>'
self.setAskUi(string,u"&#1051;&#1072;&#1074;&#1080;&#1085;&#1072;",u"&#1058;&#1086;&#1088;&#1085;&#1072;&#1076;&#1086;",u"&#1057;&#1077;&#1083;&#1100;","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>&#1050;&#1090;&#1086; &#1074;&#1099;&#1074;&#1077;&#1083; &#1101;&#1090;&#1091; &#1092;&#1086;&#1088;&#1084;&#1091;&#1083;&#1091;?<b></center>'
self.setAskUi(string,u"&#1053;&#1080;&#1094;&#1096;&#1077;",u"&#1051;&#1077;&#1085;&#1080;&#1085;",u"&#1069;&#1085;&#1096;&#1090;&#1077;&#1081;&#1085;","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'&#1055;&#1088;&#1086;&#1087;&#1091;&#1089;&#1090;&#1080;&#1090;&#1100;')
self.ui.ok.setText(u'&#1054;&#1090;&#1074;&#1077;&#1090;&#1080;&#1090;&#1100;')
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'&#1047;&#1072;&#1074;&#1077;&#1088;&#1096;&#1080;&#1090;&#1100;')
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>&#1055;&#1088;&#1077;&#1076;&#1099;&#1076;&#1091;&#1097;&#1080;&#1081;</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>&#1055;&#1088;&#1086;&#1087;&#1091;&#1089;&#1090;&#1080;&#1090;&#1100;</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="ok">
      <property name="text">
       <string>&#1054;&#1090;&#1074;&#1077;&#1090;&#1080;&#1090;&#1100;</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