Форум сайта python.su
Всем привет, у меня возникла проблема при работе с 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_())
Отредактировано (Янв. 21, 2009 12:19:50)
Офлайн
Вот ещё один довод в пользу того, что не надо пользоваться дизайнером, от этого знаний мало:)
А теперь по теме: замени 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_())
Офлайн
спасибо, заработало
Офлайн
Всем привет. У меня вопрос по поводу того, как лучше повесить какую-то функцию на кнопку. То есть, если я получал сигнал нажатия кнопки, то раньше я просто “вешал на него” любую функцию. Но тут стал вопрос, когда выполнение функции занимает каке-то время и она пишет лог в textBrowser по ходу выпонения. При обычном “вешании” окно зависает и ждет пока не выполнится функция. Я пока начал пользоваться потоками через threading, но может есть какое-то более рациональное решение?
Отредактировано (Янв. 2, 2008 21:40:16)
Офлайн
Нужно в теле функции-оброботчика вызывать QtCore.QApplication.processEvents(), только тут не стоит забывать о синхронизации, поэтому я обычно деактивирую кнопку в начале функции и активирую в конце, а то получится “хлопание дверью”:), ну это я так - сказал на всякий случай.
Отредактировано (Янв. 3, 2008 00:43:51)
Офлайн
poltergeistА можно маленький пример для наглядности? :)
Нужно в теле функции-оброботчика вызывать QtCore.QApplication.processEvents()
poltergeistКстати, по поводу деактивации: я деактивирую не только кнопку, но и comboBox. Делаю это так:
только тут не стоит забывать о синхронизации, поэтому я обычно деактивирую кнопку в начале функции и активирую в конце, а то получится “хлопание дверью”:), ну это я так - сказал на всякий случай.
Отредактировано (Янв. 4, 2008 23:24:18)
Офлайн
сори, малость описался:) вот пример:
def testDef ():
self.ui.comboBox.setEnabled (False)
…
for i in range(1000):
…
QtGui.QApplication.processEvents()
self.ui.comboBox.setEnabled (True)
Офлайн
poltergeistа если мне необходимо, скажем, скопировать один большой файл, то я делал так:
сори, малость описался:) вот пример:
def testDef ():
self.ui.comboBox.setEnabled (False)
…
for i in range(1000):
…
QtGui.QApplication.processEvents()
self.ui.comboBox.setEnabled (True)
Отредактировано (Янв. 5, 2008 23:33:04)
Офлайн
Советую глянуть сюда: C:\Python25\Lib\shutil.py - там ничего заумного, и нахерачить что-то своё (просто добавить недостающее) не составит труда, с коллбэками или сразу с QtGui.QApplication.processEvents() + ещё добавить QProgressDialog с выводом прогреса копирования, если файл такой уж большой.
Офлайн
а подскажите пожалуйста, куда копать, чтобы элементыы при изменении окна изменяли свои размеры?
Офлайн