Уведомления

Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Май 29, 2007 16:54:59

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Всем привет, у меня возникла проблема при работе с PyQt, создаю форму в Qt Designer:

<ui version=“4.0” >
<class>MainWindow</class>
<widget class=“QMainWindow” name=“MainWindow” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>0</y>
<width>604</width>
<height>367</height>
</rect>
</property>
<property name=“windowTitle” >
<string>MainWindow</string>
</property>
<widget class=“QWidget” name=“centralwidget” >
<widget class=“QTabWidget” name=“tabWidget” >
<property name=“geometry” >
<rect>
<x>230</x>
<y>0</y>
<width>381</width>
<height>436</height>
</rect>
</property>
<property name=“currentIndex” >
<number>0</number>
</property>
<widget class=“QWidget” name=“tab” >
<attribute name=“title” >
<string>Tab 1</string>
</attribute>
<widget class=“QTextBrowser” name=“textBrowser_2” >
<property name=“geometry” >
<rect>
<x>9</x>
<y>9</y>
<width>357</width>
<height>193</height>
</rect>
</property>
</widget>
<widget class=“QTextBrowser” name=“textBrowser” >
<property name=“geometry” >
<rect>
<x>9</x>
<y>208</y>
<width>357</width>
<height>192</height>
</rect>
</property>
</widget>
</widget>
</widget>
<widget class=“QWidget” name=“horizontalLayout” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>10</y>
<width>231</width>
<height>22</height>
</rect>
</property>
<layout class=“QHBoxLayout” >
<property name=“margin” >
<number>0</number>
</property>
<property name=“spacing” >
<number>6</number>
</property>
<item>
<widget class=“QLabel” name=“label” >
<property name=“text” >
<string>IP-адрес машины:</string>
</property>
</widget>
</item>
<item>
<widget class=“QLineEdit” name=“lineEdit” />
</item>
</layout>
</widget>
<widget class=“QWidget” name=“horizontalLayout_2” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>120</y>
<width>231</width>
<height>22</height>
</rect>
</property>
<layout class=“QHBoxLayout” >
<property name=“margin” >
<number>0</number>
</property>
<property name=“spacing” >
<number>6</number>
</property>
<item>
<widget class=“QLabel” name=“label_5” >
<property name=“text” >
<string>Адрес:</string>
</property>
</widget>
</item>
<item>
<widget class=“QLineEdit” name=“lineEdit_3” />
</item>
</layout>
</widget>
<widget class=“QLabel” name=“label_4” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>40</y>
<width>61</width>
<height>20</height>
</rect>
</property>
<property name=“text” >
<string>ID машины:</string>
</property>
</widget>
<widget class=“QWidget” native=“1” name=“widget_2” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>60</y>
<width>220</width>
<height>51</height>
</rect>
</property>
<widget class=“QLabel” name=“label_3” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>10</y>
<width>152</width>
<height>20</height>
</rect>
</property>
<property name=“text” >
<string>Число пакетов для проверки:</string>
</property>
</widget>
<widget class=“QSpinBox” name=“spinBox” >
<property name=“geometry” >
<rect>
<x>160</x>
<y>10</y>
<width>44</width>
<height>18</height>
</rect>
</property>
</widget>
<widget class=“QSpinBox” name=“spinBox_2” >
<property name=“geometry” >
<rect>
<x>160</x>
<y>30</y>
<width>44</width>
<height>18</height>
</rect>
</property>
</widget>
<widget class=“QLabel” name=“label_2” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>30</y>
<width>152</width>
<height>20</height>
</rect>
</property>
<property name=“text” >
<string>Процент потерь:</string>
</property>
</widget>
</widget>
<widget class=“QLineEdit” name=“lineEdit_2” >
<property name=“geometry” >
<rect>
<x>60</x>
<y>40</y>
<width>171</width>
<height>20</height>
</rect>
</property>
</widget>
</widget>
<widget class=“QMenuBar” name=“menubar” >
<property name=“geometry” >
<rect>
<x>0</x>
<y>0</y>
<width>604</width>
<height>24</height>
</rect>
</property>
<widget class=“QMenu” name=“menu” >
<property name=“title” >
<string>Файл</string>
</property>
<addaction name=“action” />
<addaction name=“separator” />
<addaction name=“action_2” />
</widget>
<addaction name=“menu” />
</widget>
<widget class=“QStatusBar” name=“statusbar” />
<action name=“action” >
<property name=“text” >
<string>Настройки</string>
</property>
</action>
<action name=“action_2” >
<property name=“text” >
<string>Выход</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>
перегоняю её в код Питона командой:
pyuic4.bat face.ui > face.py
генерится следующий код в вайл face.py:
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'D:\Python\QT\face.ui'
#
# Created: Tue May 29 16:13:47 2007
# by: PyQt4 UI code generator 4.2
#
# 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(QtCore.QSize(QtCore.QRect(0,0,604,367).size()).expandedTo(MainWindow.minimumSizeHint()))

self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")

self.tabWidget = QtGui.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(230,0,381,436))
self.tabWidget.setObjectName("tabWidget")

self.tab = QtGui.QWidget()
self.tab.setObjectName("tab")

self.textBrowser_2 = QtGui.QTextBrowser(self.tab)
self.textBrowser_2.setGeometry(QtCore.QRect(9,9,357,193))
self.textBrowser_2.setObjectName("textBrowser_2")

self.textBrowser = QtGui.QTextBrowser(self.tab)
self.textBrowser.setGeometry(QtCore.QRect(9,208,357,192))
self.textBrowser.setObjectName("textBrowser")
self.tabWidget.addTab(self.tab,"")

self.horizontalLayout = QtGui.QWidget(self.centralwidget)
self.horizontalLayout.setGeometry(QtCore.QRect(0,10,231,22))
self.horizontalLayout.setObjectName("horizontalLayout")

self.hboxlayout = QtGui.QHBoxLayout(self.horizontalLayout)
self.hboxlayout.setMargin(0)
self.hboxlayout.setSpacing(6)
self.hboxlayout.setObjectName("hboxlayout")

self.label = QtGui.QLabel(self.horizontalLayout)
self.label.setObjectName("label")
self.hboxlayout.addWidget(self.label)

self.lineEdit = QtGui.QLineEdit(self.horizontalLayout)
self.lineEdit.setObjectName("lineEdit")
self.hboxlayout.addWidget(self.lineEdit)

self.horizontalLayout_2 = QtGui.QWidget(self.centralwidget)
self.horizontalLayout_2.setGeometry(QtCore.QRect(0,120,231,22))
self.horizontalLayout_2.setObjectName("horizontalLayout_2")

self.hboxlayout1 = QtGui.QHBoxLayout(self.horizontalLayout_2)
self.hboxlayout1.setMargin(0)
self.hboxlayout1.setSpacing(6)
self.hboxlayout1.setObjectName("hboxlayout1")

self.label_5 = QtGui.QLabel(self.horizontalLayout_2)
self.label_5.setObjectName("label_5")
self.hboxlayout1.addWidget(self.label_5)

self.lineEdit_3 = QtGui.QLineEdit(self.horizontalLayout_2)
self.lineEdit_3.setObjectName("lineEdit_3")
self.hboxlayout1.addWidget(self.lineEdit_3)

self.label_4 = QtGui.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(0,40,61,20))
self.label_4.setObjectName("label_4")

self.widget_2 = QtGui.QWidget(self.centralwidget)
self.widget_2.setGeometry(QtCore.QRect(0,60,220,51))
self.widget_2.setObjectName("widget_2")

self.label_3 = QtGui.QLabel(self.widget_2)
self.label_3.setGeometry(QtCore.QRect(0,10,152,20))
self.label_3.setObjectName("label_3")

self.spinBox = QtGui.QSpinBox(self.widget_2)
self.spinBox.setGeometry(QtCore.QRect(160,10,44,18))
self.spinBox.setObjectName("spinBox")

self.spinBox_2 = QtGui.QSpinBox(self.widget_2)
self.spinBox_2.setGeometry(QtCore.QRect(160,30,44,18))
self.spinBox_2.setObjectName("spinBox_2")

self.label_2 = QtGui.QLabel(self.widget_2)
self.label_2.setGeometry(QtCore.QRect(0,30,152,20))
self.label_2.setObjectName("label_2")

self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(60,40,171,20))
self.lineEdit_2.setObjectName("lineEdit_2")
#MainWindow.setCentralWidget(self.centralwidget)

self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0,0,604,24))
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.action_2 = QtGui.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.menu.addAction(self.action)
self.menu.addSeparator()
self.menu.addAction(self.action_2)
self.menubar.addAction(self.menu.menuAction())

self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "Tab 1", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("MainWindow", "IP-адрес машины:", None, QtGui.QApplication.UnicodeUTF8))
self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Адрес:", None, QtGui.QApplication.UnicodeUTF8))
self.label_4.setText(QtGui.QApplication.translate("MainWindow", "ID машины:", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("MainWindow", "Число пакетов для проверки:", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("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))
self.action_2.setText(QtGui.QApplication.translate("MainWindow", "Выход", None, QtGui.QApplication.UnicodeUTF8))
запускаю все следующим кодом:
import sys
from face import Ui_MainWindow
from PyQt4 import QtCore, QtGui

class WellForm(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
fmMain = WellForm()
fmMain.show()
sys.exit(app.exec_())
врезультате, мне приходится коментить 3 строки в коде face.py чтобы запустилось, но вид сильно колбасится. Не знаете, что нитак?



Отредактировано (Янв. 21, 2009 12:19:50)

Офлайн

#2 Май 29, 2007 19:32:44

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Вот ещё один довод в пользу того, что не надо пользоваться дизайнером, от этого знаний мало:)

А теперь по теме: замени QWidget на QMainWindow и всё станет на свои места, ты видимо что-то напутал:)

Вот:

import sys
from face import Ui_MainWindow
from PyQt4 import QtCore, QtGui

class WellForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

if __name__ == “__main__”:
app = QtGui.QApplication(sys.argv)
fmMain = WellForm()
fmMain.show()
sys.exit(app.exec_())



Офлайн

#3 Май 29, 2007 19:59:49

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

спасибо, заработало



Офлайн

#4 Янв. 2, 2008 21:39:11

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Всем привет. У меня вопрос по поводу того, как лучше повесить какую-то функцию на кнопку. То есть, если я получал сигнал нажатия кнопки, то раньше я просто “вешал на него” любую функцию. Но тут стал вопрос, когда выполнение функции занимает каке-то время и она пишет лог в textBrowser по ходу выпонения. При обычном “вешании” окно зависает и ждет пока не выполнится функция. Я пока начал пользоваться потоками через threading, но может есть какое-то более рациональное решение?



Отредактировано (Янв. 2, 2008 21:40:16)

Офлайн

#5 Янв. 3, 2008 00:41:30

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Нужно в теле функции-оброботчика вызывать QtCore.QApplication.processEvents(), только тут не стоит забывать о синхронизации, поэтому я обычно деактивирую кнопку в начале функции и активирую в конце, а то получится “хлопание дверью”:), ну это я так - сказал на всякий случай.



Отредактировано (Янв. 3, 2008 00:43:51)

Офлайн

#6 Янв. 4, 2008 14:46:38

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

poltergeist
Нужно в теле функции-оброботчика вызывать QtCore.QApplication.processEvents()
А можно маленький пример для наглядности? :)
poltergeist
только тут не стоит забывать о синхронизации, поэтому я обычно деактивирую кнопку в начале функции и активирую в конце, а то получится “хлопание дверью”:), ну это я так - сказал на всякий случай.
Кстати, по поводу деактивации: я деактивирую не только кнопку, но и comboBox. Делаю это так:

def testDef ():
self.ui.comboBox.setEnabled (False)

self.ui.comboBox.setEnabled (True)

startComm = threading.Thread (target = testDef)
startComm.start ()

Врезультате, после активации я не могу вызывать выпадающее меню. Если покручу колесо мыши, то пункты меняются, но меню не выпадает. Но если я этот код делаю без потока, то все нормально. Не знаете, в чем тут может быть проблема?



Отредактировано (Янв. 4, 2008 23:24:18)

Офлайн

#7 Янв. 4, 2008 23:56:04

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

сори, малость описался:) вот пример:

def testDef ():
self.ui.comboBox.setEnabled (False)

for i in range(1000):

QtGui.QApplication.processEvents()

self.ui.comboBox.setEnabled (True)



Офлайн

#8 Янв. 5, 2008 13:45:53

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

poltergeist
сори, малость описался:) вот пример:

def testDef ():
self.ui.comboBox.setEnabled (False)

for i in range(1000):

QtGui.QApplication.processEvents()

self.ui.comboBox.setEnabled (True)
а если мне необходимо, скажем, скопировать один большой файл, то я делал так:

def myCopy (inFile, outFile):
self.ui.comboBox.setEnabled (False)
shutil.copy (inFile, outFile)
self.ui.comboBox.setEnabled (True)


startComm = threading.Thread (target = myCopy, args = )
startComm.start ()

Тогда у меня форма не замирает в ожидании, пока скопируется файл. А как этот же пример можно организовать с помощью QtGui.QApplication.processEvents()? Заранее спасибо :)

Хм, обновил Qt и PyQt и проблема с невыпадающим comboBox пропала. Осталось только с потоками разобраться :)



Отредактировано (Янв. 5, 2008 23:33:04)

Офлайн

#9 Янв. 7, 2008 11:18:16

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Советую глянуть сюда: C:\Python25\Lib\shutil.py - там ничего заумного, и нахерачить что-то своё (просто добавить недостающее) не составит труда, с коллбэками или сразу с QtGui.QApplication.processEvents() + ещё добавить QProgressDialog с выводом прогреса копирования, если файл такой уж большой.



Офлайн

#10 Янв. 9, 2008 16:28:17

aliens
От:
Зарегистрирован: 2007-08-14
Сообщения: 135
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

а подскажите пожалуйста, куда копать, чтобы элементыы при изменении окна изменяли свои размеры?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version