2013-12-01 11 views
0

загружаю главное окно от УИ файла: main_1.pyresizeEvent не работает, если я использую QUiLoader для QMainWindow

from PySide import QtCore, QtGui, QtUiTools 
import sys 

class ControlMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     loader = QtUiTools.QUiLoader() 
     file = QtCore.QFile("lat.ui") 
     file.open(QtCore.QFile.ReadOnly) 
     self.ui = loader.load(file) 
     file.close 

    def show(self): 
     self.ui.show() 

    def resizeEvent(self, event): 
     print event 

app = QtGui.QApplication(sys.argv) 
MW = ControlMainWindow() 
MW.show() 
sys.exit(app.exec_()) 

lat.ui

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>708</width> 
    <height>488</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralwidget"> 
    <widget class="QLabel" name="label"> 
    <property name="geometry"> 
    <rect> 
     <x>310</x> 
     <y>170</y> 
     <width>56</width> 
     <height>13</height> 
    </rect> 
    </property> 
    <property name="text"> 
    <string>TextLabel</string> 
    </property> 
    </widget> 
    </widget> 
    <widget class="QMenuBar" name="menubar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>708</width> 
    <height>22</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QStatusBar" name="statusbar"/> 
</widget> 
<resources/> 
<connections/> 
</ui> 

в этом случае resizeEvent не делает получить какие-либо события. Тем не менее, если я загрузить мой дизайн пользовательского интерфейса после PySide-UIC компиляции он работает хорошо main_2.py:

from PySide import QtCore, QtGui 
import sys 
import ui_lat 

class ControlMainWindow(QtGui.QMainWindow, ui_lat.Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(ControlMainWindow, self).__init__(parent) 
     self.setupUi(self) 

    def resizeEvent(self, event): 
     print event 

app = QtGui.QApplication(sys.argv) 
MW = ControlMainWindow() 
MW.show() 
sys.exit(app.exec_()) 

ui_lat.py

from PySide import QtCore, QtGui 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(708, 488) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.label = QtGui.QLabel(self.centralwidget) 
     self.label.setGeometry(QtCore.QRect(310, 170, 56, 13)) 
     self.label.setObjectName("label") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar() 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 708, 22)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("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.label.setText(QtGui.QApplication.translate("MainWindow", "TextLabel", None, QtGui.QApplication.UnicodeUTF8)) 

Как я могу получить доступ к событиям главного окна (например, resizeEvent) первым способом?

+0

Я не могу воспроизвести это. Хотя первый метод не создает ui правильно, события изменения размера _are_ печатаются, как ожидалось. – ekhumoro

+0

Не могли бы вы разместить файл lat.ui? (или минималистический пример файла UI, который демонстрирует проблему). У вас есть QMainWindow, определенный в файле ui? –

ответ

1

Ваша проблема в том, что, когда вы используете файл * .ui, вы фактически создаете экземпляр 2 QMainWindow. Когда вы создаете экземпляр класса ControlMainWindow и один раз при загрузке файла пользовательского интерфейса.

К сожалению, PySide немного недостаток в этом отношении, и решение в основном заключается в подклассе загрузчика пользовательского интерфейса PySide для его исправления. Вы должны будете следить за https://stackoverflow.com/a/14894550/1994235, чтобы получить свое решение. Обратите внимание, что код loadUI, связанный с этим сообщением, стоит узнать и, возможно, изменить (например, я не согласен с использованием QMetaObject.connectSlotsByName(widget))

Смежные вопросы