Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Как связать самодельный код с полученным кодом после QTDesigner? [RSS Feed]

#1 Май 29, 2011 20:12:50

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Сразу говорю, я не программист, а всего лишь пытаюсь для своей работы освоить азы и написать полезные программки,
поэтому просьба не забрасывать гнилыми помидорами, а помочь, если нетрудно.
Выбрал простой пример, который решается в 1 действие. Задаётся площадь, выбирается шаг. Делением площади на шаг получаем длину.
В самом питоне без GUI эту задачу решаю кодом который привожу ниже. (уверен что есть более изящные способы, но этот тоже работает)

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

def Length():
Step_type_list = ['Small', 'Medium', 'Large']
Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list.index(Step_type)]

Area = 100 # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
print(Result)

if __name__ == "__main__": Length()
Набросал в QT Designer, как должно выглядеть окно для пользователя. pyuic сгенерировал следующий код:

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

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

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

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Result, m:", None, QtGui.QApplication.UnicodeUTF8))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Вопрос заключается в том, как объединить эти два кода в один. В качестве ответа хорошо было бы получить итоговый код (в идеале с комментариями:) ).
возможно тут сигналы/слоты нужно использовать, но для подобной задачи примеров в сети не нашёл.



Отредактировано (Май 29, 2011 20:19:06)

Офлайн

#2 Май 29, 2011 20:40:01

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

модераторы тему переместили из “Python для новичков”.
там можно глупые вопросы задавать, а тут можно нарваца на злых професоналов…



Офлайн

#3 Май 29, 2011 21:23:11

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.comboBox.activated.connect(self.on_combo_activated)
self.lineEdit_Area.textChanged.connect(self.on_input_textChanged)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Result, m:", None, QtGui.QApplication.UnicodeUTF8))

def on_combo_activated(self, index):
self.length()

def on_input_textChanged(self, string):
self.length()

def length(self):
Step_type_list = self.comboBox.currentIndex()
# Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list]

Area = int(self.lineEdit_Area.text()) # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
self.lineEdit_2.setText(str(Result))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())



Офлайн

#4 Май 29, 2011 22:17:05

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Низкий поклон тебе, комрад!
работает. Буду разбираться, и пользоваться в дальнейшем.



Офлайн

#5 Май 29, 2011 23:26:52

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Как связать самодельный код с полученным кодом после QTDesigner?

Удобней хранить автоматически сгенерированный код отдельно, в таком случае вы всегда сможете изменить разметку окна без переноса функций.

mainwindow.py - сгенерирован автоматом:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(314, 228)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.comboBox = QtGui.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(30, 30, 69, 22))
self.comboBox.setObjectName(_fromUtf8("comboBox"))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.addItem(_fromUtf8(""))
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 71, 16))
self.label.setObjectName(_fromUtf8("label"))
self.lineEdit_Area = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_Area.setGeometry(QtCore.QRect(120, 70, 31, 20))
self.lineEdit_Area.setObjectName(_fromUtf8("lineEdit_Area"))
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 70, 81, 16))
self.label_2.setObjectName(_fromUtf8("label_2"))
self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(120, 150, 31, 20))
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(60, 150, 51, 16))
self.label_3.setObjectName(_fromUtf8("label_3"))
self.line = QtGui.QFrame(self.centralwidget)
self.line.setGeometry(QtCore.QRect(0, 130, 311, 20))
self.line.setFrameShape(QtGui.QFrame.HLine)
self.line.setFrameShadow(QtGui.QFrame.Sunken)
self.line.setObjectName(_fromUtf8("line"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 314, 20))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)

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

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Small", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Medium", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.setItemText(2, QtGui.QApplication.translate("MainWindow", "Large", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "Choose step:", None, QtGui.QApplication.UnicodeUTF8))
self.lineEdit_Area.setText(QtGui.QApplication.translate("MainWindow", "100", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Input Area, m2:", None, QtGui.QApplication.UnicodeUTF8))
файл с вашими функциями

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from PyQt4 import QtCore, QtGui, Qsci
from mainwindow import Ui_MainWindow

class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setupUi(self)
self.comboBox.activated.connect(self.on_combo_activated)
self.lineEdit_Area.textChanged.connect(self.on_input_textChanged)

def on_combo_activated(self, index):
self.length()

def on_input_textChanged(self, string):
self.length()

def length(self):
Step_type_list = self.comboBox.currentIndex()
# Step_type = 'Small' # значение должно выбираться в пользовательском итнерфейсе из выпадающего списка
Step_list = [0.1, 0.2, 0.3]
Step = Step_list[Step_type_list]

Area = int(self.lineEdit_Area.text()) # значение должно задаваться в пользовательском итнерфейсе
Result = Area / Step # результат необходимо вывести в пользовательский интерфейс
self.lineEdit_2.setText(str(Result))

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())



Офлайн

#6 Июнь 8, 2011 11:17:05

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Друзья, в примере вы мне показали, как активируются ComboBox и LineEdit.
Подскажите еще пожалуйста как оживить другие виджеты. Конкретно сейчас интересует chekbox.
Как будут выглядеть строки оживления для аналогичного примера с QTDesigner-ским кодом?
Если есть ссылка где доступно описаны такие варианты, киньте пожалуйста, чтоб я по отдельным виджетам не дёргал.
Все мои попытки найти что-то путёвое самостоятельно ничем хорошим не закончились.
http://zetcode.com/tutorials/pyqt4/widgets/
например из этой ссылки не получается удачно присобачить, чтоб работало.



Офлайн

#7 Июнь 8, 2011 12:34:58

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Дык Вы про signal/slot механизм поняли? Находите у виджета удобный сигнал и соединяете его со своим обработчиком…
http://doc.qt.nokia.com/4.7/qcheckbox.html#stateChanged



Офлайн

#8 Июнь 8, 2011 13:12:06

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

понять то может и поняли, но чтоб применить это понимание пока что без примеров не обойтись.
тут кагбэ синтаксис важен. по ссылке этой тоже раньше оказывался, но каюсь нихера не понимаю )) как можно воспользоваться этими выкладками?
оно для меня там в каком-то абстрактном виде, на примерах как-то более понятно. еще не дорос до того чтобы понимать как мне может помочь строка типа этой:
bool QCheckBox::event ( QEvent * e )

ps. Studentik, спасибо за помощь по всем предыдущим вопросам.
сори за нубизм.



Отредактировано (Июнь 8, 2011 13:13:39)

Офлайн

#9 Июнь 8, 2011 13:47:27

Studentik
От:
Зарегистрирован: 2009-12-26
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Разжевываю:
1) Открывайте справку по QCheckBox и внимательно посмотрите на единственный сигнал “stateChanged” и его аргументы
2) в своем коде сделайте функцию с аргументами, как у stateChanged
3) в своем коде где-то выполните your_check_box.stateChanged.connect(your_handler)
4) PROFIT!



Офлайн

#10 Июнь 8, 2011 17:58:16

Holden
От:
Зарегистрирован: 2011-05-04
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Как связать самодельный код с полученным кодом после QTDesigner?

Studentik
Разжевываю:
1) Открывайте справку по QCheckBox и внимательно посмотрите на единственный сигнал “stateChanged” и его аргументы
2) в своем коде сделайте функцию с аргументами, как у stateChanged
3) в своем коде где-то выполните your_check_box.stateChanged.connect(your_handler)
4) PROFIT!
Гран мэрси! Буду пробовать.



Офлайн

  • Начало
  • » GUI
  • » Как связать самодельный код с полученным кодом после QTDesigner?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version