2015-05-14 1 views
1

Я получаю сообщение об ошибке при попытке запустить этот код:AttributeError: объект «QSlider» не имеет атрибута «subtractStep»

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file 'scaler_gui_3.ui' 
# 
# Created: Thu May 14 13:05:28 2015 
#  by: PyQt4 UI code generator 4.11.3 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(270, 219) 
     self.gridLayout_2 = QtGui.QGridLayout(Form) 
     self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) 
     self.horizontalSliderFrames = QtGui.QSlider(Form) 
     self.horizontalSliderFrames.setOrientation(QtCore.Qt.Horizontal) 
     self.horizontalSliderFrames.setObjectName(_fromUtf8("horizontalSliderFrames")) 
     self.gridLayout_2.addWidget(self.horizontalSliderFrames, 1, 0, 1, 1) 
     self.gridLayout = QtGui.QGridLayout() 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.verticalScrollBarIW = QtGui.QScrollBar(Form) 
     self.verticalScrollBarIW.setOrientation(QtCore.Qt.Vertical) 
     self.verticalScrollBarIW.setObjectName(_fromUtf8("verticalScrollBarIW")) 
     self.gridLayout.addWidget(self.verticalScrollBarIW, 0, 2, 1, 1) 
     self.verticalLayout_2 = QtGui.QVBoxLayout() 
     self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) 
     self.labelMain = QtGui.QLabel(Form) 
     self.labelMain.setObjectName(_fromUtf8("labelMain")) 
     self.verticalLayout_2.addWidget(self.labelMain) 
     self.horizontalScrollBarIW = QtGui.QScrollBar(Form) 
     self.horizontalScrollBarIW.setOrientation(QtCore.Qt.Horizontal) 
     self.horizontalScrollBarIW.setObjectName(_fromUtf8("horizontalScrollBarIW")) 
     self.verticalLayout_2.addWidget(self.horizontalScrollBarIW) 
     self.gridLayout.addLayout(self.verticalLayout_2, 0, 0, 1, 1) 
     spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) 
     self.gridLayout.addItem(spacerItem, 0, 1, 1, 1) 
     self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) 
     self.horizontalLayout_2 = QtGui.QHBoxLayout() 
     self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) 
     self.gridLayout_2.addLayout(self.horizontalLayout_2, 6, 1, 1, 1) 
     self.verticalLayout = QtGui.QVBoxLayout() 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 
     self.horizontalLayout_3 = QtGui.QHBoxLayout() 
     self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) 
     self.labelSmallIW = QtGui.QLabel(Form) 
     self.labelSmallIW.setObjectName(_fromUtf8("labelSmallIW")) 
     self.horizontalLayout_3.addWidget(self.labelSmallIW) 
     self.labelBigIW = QtGui.QLabel(Form) 
     self.labelBigIW.setObjectName(_fromUtf8("labelBigIW")) 
     self.horizontalLayout_3.addWidget(self.labelBigIW) 
     self.pushButton = QtGui.QPushButton(Form) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.horizontalLayout_3.addWidget(self.pushButton) 
     self.verticalLayout.addLayout(self.horizontalLayout_3) 
     self.gridLayout_2.addLayout(self.verticalLayout, 4, 0, 1, 1) 
     self.horizontalLayout = QtGui.QHBoxLayout() 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     self.toolButtonLoad = QtGui.QToolButton(Form) 
     self.toolButtonLoad.setObjectName(_fromUtf8("toolButtonLoad")) 
     self.horizontalLayout.addWidget(self.toolButtonLoad) 
     self.prevButton = QtGui.QPushButton(Form) 
     self.prevButton.setObjectName(_fromUtf8("prevButton")) 
     self.horizontalLayout.addWidget(self.prevButton) 
     self.nextButton = QtGui.QPushButton(Form) 
     self.nextButton.setObjectName(_fromUtf8("nextButton")) 
     self.horizontalLayout.addWidget(self.nextButton) 
     self.gridLayout_2.addLayout(self.horizontalLayout, 2, 0, 1, 1) 
     self.checkBox = QtGui.QCheckBox(Form) 
     self.checkBox.setObjectName(_fromUtf8("checkBox")) 
     self.gridLayout_2.addWidget(self.checkBox, 5, 0, 1, 1) 

     self.retranslateUi(Form) 
     QtCore.QObject.connect(self.prevButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.horizontalSliderFrames.subtractStep) 
     QtCore.QObject.connect(self.nextButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.horizontalSliderFrames.addStep) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 
     self.labelMain.setText(_translate("Form", "TextLabel", None)) 
     self.labelSmallIW.setText(_translate("Form", "TextLabel", None)) 
     self.labelBigIW.setText(_translate("Form", "TextLabel", None)) 
     self.pushButton.setText(_translate("Form", "PushButton", None)) 
     self.toolButtonLoad.setText(_translate("Form", "...", None)) 
     self.prevButton.setText(_translate("Form", "<", None)) 
     self.nextButton.setText(_translate("Form", ">", None)) 
     self.checkBox.setText(_translate("Form", "CheckBox", None)) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle('cleanlooks') 
    Form = QtGui.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

Похоже, подобная ошибка случается с другими людьми из-за какой-то «класса связанной проблемы ", о которых я понятия не имею. Я не понимаю, почему это, кажется, работает хорошо, когда я «запустить» в из текстового редактора Geany, но не тогда, когда я запускаю его из терминала с помощью питона my_gui.py я получаю эту ошибку:

Traceback (most recent call last): 
    File "gui_template.ui.py", line 136, in <module> 
    ui = Ui_Form() 
    File "gui_template.ui.py", line 39, in __init__ 
    self.setupUi(self) 
    File "gui_template.ui.py", line 89, in setupUi 
    QtCore.QObject.connect(self.prevButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.horizontalSliderFrames.subtractStep) 
AttributeError: 'QSlider' object has no attribute 'subtractStep' 

Я также пытался создать отдельный .py файл в аналогично тому, как этот человек делает это:

https://youtu.be/FcX2FsPlVeI?t=10m25s

Однако, я все еще получаю ту же ошибку ... Любые идеи?

ответ

1

addStep и subtractStep: deprecated members of QSlider. Они доступны только для обеспечения обратной совместимости с Qt3.

Кажется, вы должны запустить сценарий примера, используя сборки Qt4/PyQt4, которые не включают такие устаревшие API.

В документации предлагается использовать слот setValue. Но для этого требуется передача соответствующего значения приращения/уменьшения, поэтому на самом деле это не замена (особенно если вы подключаете сигналы через Qt Designer).

Если вы хотите, чтобы исправить этот пример, вы должны заменить два соединения сигнал/слот с чем-то вроде:

def setSlider(delta): 
     self.horizontalSliderFrames.setValue(
      self.horizontalSliderFrames.value() + 
      delta * self.horizontalSliderFrames.singleStep()) 

    self.prevButton.clicked.connect(lambda: setSlider(-1)) 
    self.nextButton.clicked.connect(lambda: setSlider(+1)) 
+0

Действительно странно! Я использовал Qt 4 Designer для подключения слайдера/кнопки, но все же он использовал старый синтаксис ... –

+0

@Vitto. Откуда взялись ваши пакеты Qt4/PyQt4? Я бы подумал, что устаревшие API обычно включаются по умолчанию (они для меня в Arch Linux). – ekhumoro

+0

Хороший вопрос. IIRC, я просто установил его обычным способом. sudo apt-get install qt4-dev-tools qt4-designer Но прошло какое-то время, поэтому я действительно не могу сказать точно. –

Смежные вопросы