Похоже, что код, который вы опубликовали, был скопирован из this answer. Этот код представляет собой простой, написанный вручную пример, который вообще не предполагает использование Qt Designer. Пример
A "Hello World" с помощью Qt Designer будет начать с ui
файла, как это:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Window</class>
<widget class="QWidget" name="Window">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>171</width>
<height>61</height>
</rect>
</property>
<property name="windowTitle">
<string>Hello World</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="button">
<property name="text">
<string>Test</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Этот файл может быть сохранен как helloworld.ui
и открыт в Qt Designer.
Первое, что нужно знать о Qt Designer, заключается в том, что оно не является IDE - оно используется только для проектирования графического интерфейса, а не для основной программной логики. Логика программы записывается отдельно и затем подключается к графическому интерфейсу.
Существует два способа сделать это. Во-первых, чтобы загрузить файл ui
непосредственно, используя uic module:
import sys, os
from PyQt4 import QtGui, QtCore, uic
DIRPATH = os.path.join(os.path.dirname(os.path.abspath(__file__)))
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
uic.loadUi(os.path.join(DIRPATH, 'helloworld.ui'), self)
self.button.clicked.connect(self.handleButton)
def handleButton(self):
print('Hello World')
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
Это впрыскивает GUI в местный Window
класс, который является подклассом соответствующий класс GUI верхнего уровня с помощью Qt Designer (который в этом случае также называется «Окно», но может быть любым, что вам нравится). Другие виджеты GUI становятся атрибутами подкласса, поэтому QPushButton доступен как self.button
.
Другой способ подключения графического интерфейса пользователя с логикой программы, заключается в использовании pyuic tool для создания модуля питона из ui
файла:
pyuic4 --output=helloworld.py helloworld.ui
, которые затем могут быть импортируемым в основное приложение:
import sys
from PyQt4 import QtGui, QtCore
from helloworld import Ui_Window
class Window(QtGui.QWidget, Ui_Window):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
self.button.clicked.connect(self.handleButton)
def handleButton(self):
print('Hello World')
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
метод setupUi
наследуется от сгенерированной Ui_Window
класса, и делает то же самое, как uic.loadUi
.
Пожалуйста, посмотрите мой ответ на [это] [1] сообщение. Это должно объяснить основное. [1]: http://stackoverflow.com/questions/20409016/cant-start-designed-pyqt-application/20409491#20409491 – Hyperboreus