Pyqt передача параметров в форму на основе действий пользователя - PullRequest
1 голос
/ 31 декабря 2011

У меня есть форма и всплывающая форма, как указано ниже (частичный код):

import sys
import subprocess
import os
from PyQt4 import QtCore, QtGui
from ui_auto import Ui_Form
from popup_ui import Ui_Form as fm

class MyPopupForm(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = fm()
        self.ui.setupUi(self)
class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
    def when_pressed(self):
         self.mypopup=MyPopupForm()
         self.mypopup.show()
    def when_stopped(self):
         self.mypopup=MyPopupForm()
         self.mypopup.show()

Myform - моя основная форма, а MyPopupForm - всплывающая форма. Мне нужно сделать так, чтобы, когда я нажимал кнопку, он печатал какую-то строку и отображал эту строку. Когда я нажимаю другую кнопку, я должен вызвать ту же форму, но с другой строкой. Как я мог это сделать (я использовал Qtdesigner для создания пользовательского интерфейса)

MyPopupForm код в Python:

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

# Form implementation generated from reading ui file 'popup.ui'
#
# Created: Sun Jan  8 11:18:43 2012
#      by: PyQt4 UI code generator 4.7.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(207, 170)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(60, 120, 92, 27))
        self.pushButton.setObjectName("pushButton")
        self.label = QtGui.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(58, 30, 81, 41))
        #self.label.setText("")
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "OK", None, QtGui.QApplication.UnicodeUTF8))

Ответы [ 2 ]

2 голосов
/ 11 января 2012

При компиляции модуля python с pyuic4 я думаю, что лучше всего использовать опцию -w, которая создаст гораздо более простой класс пользовательского интерфейса без всякой ерунды setupUi.

Выполнение этого также означает, что класс имеет именно то имя, которое вы дали ему в Designer (а не мерзкую искаженную версию с префиксом Ui_), и также гораздо проще подклассифицировать его, если вам нужно.

Ниже я включил файл ui с простым классом Dialog для отображения сообщения. Также есть скрипт, который демонстрирует, как его использовать.

Сохраните файл ui как dialog.ui и выполните:

pyuic4 -w dialog.ui > dialog.py

для компиляции модуля python. Затем запустите скрипт из той же директории.

Файл интерфейса пользователя :

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>125</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QLabel" name="labelMessage">
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="text">
      <string/>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
   </item>
   <item>
    <widget class="QPushButton" name="buttonClose">
     <property name="text">
      <string>Close</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>buttonClose</sender>
   <signal>clicked()</signal>
   <receiver>Dialog</receiver>
   <slot>reject()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>194</x>
     <y>107</y>
    </hint>
    <hint type="destinationlabel">
     <x>402</x>
     <y>88</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

Сценарий

from PyQt4 import QtGui, QtCore
from dialog import Dialog

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.buttonOne = QtGui.QPushButton('Test One', self)
        self.buttonOne.clicked.connect(self.handleButtonOne)
        self.buttonTwo = QtGui.QPushButton('Test Two', self)
        self.buttonTwo.clicked.connect(self.handleButtonTwo)
        layout = QtGui.QHBoxLayout(self)
        layout.addWidget(self.buttonOne)
        layout.addWidget(self.buttonTwo)

    def showDialog(self, message):
        dialog = Dialog(self)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.labelMessage.setText(message)
        dialog.show()

    def handleButtonOne(self):
        self.showDialog('This is the message for Button One')

    def handleButtonTwo(self):
        self.showDialog('This is the message for Button Two')

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
2 голосов
/ 31 декабря 2011

Самый простой способ - добавить параметр в метод __init__ класса MyPopupForm

def __init__(self, string_to_be_passed=None, parent=None):

и затем, когда вы звоните с

self.mypopup=MyPopupForm("value_to_display")

с использованием string_to_be_passed в методе __init__ для отображения значения.

Другой метод заключается в добавлении метода к классу MyPopupForm для установки отображаемой строки, а затем

self.mypopup=MyPopupForm()
self.mypopup.setValueToDisplay("value")
self.mypopup.show()

с setValueToDisplay(), которые отображают строку там, где это необходимо.

...