2010-04-20 3 views
1

여기에 고집스럽게 고집스런 문제가 있습니다. 누군가 내가 잘못하고있는 것에 대해 통찰력을 줄 수 있다면 감사하겠습니다.PyQt 및 QGridLayout에 대한 도움이 필요합니다.

숫자 표를 표시해야하는 PyQt 앱이 있습니다. 그래서 당연히 QTableWidget을 사용하고 있습니다. 지금 당장은 매우 간단합니다. 내가하는 일은 테이블 위젯과 버튼이있는 창을 만들고 표시하는 것뿐입니다. 나는 테이블을 아직 채우지 않을 것이다.

테이블을 자동으로 창의 크기를 조정할 수있게하려면이 양식에 다른 위젯을 추가 할 예정이므로 QGridLayout을 사용하고 있습니다. Qt Designer에서 양식을 미리 볼 때 모양이 올바르게 나타나고 올바르게 동작합니다. 표는 버튼이 사용하는 공간을 제외하고 모든 양식을 사용하며 창 크기를 조정하면 둘 다 올바르게 크기가 조정됩니다. 그러나 생성 된 파이썬 코드를 실행하려고하면 모든 것이 엉망이됩니다. 표 위젯과 버튼은 모두 창의 상단 왼쪽 모서리에 서로 겹쳐서 표시됩니다.

Qt Designer 4를 사용하여 .ui 파일을 만들고 pyuic4를 사용하여 파이썬 코드를 생성했습니다. 나는 수동으로 파일 중 하나를 전혀 편집하지 않았다. 그래서 나는 기본적인 구문 오류가 없다고 가정합니다. 내 생각 엔 위젯, 창 및 레이아웃 관리자 간의 관계를 어떻게 든 오해하고 있습니다. 그러나 나는 방법을 이해할 수 없다. 여기

내 .ui 파일에 대한 코드입니다

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>TableWindow</class> 
<widget class="QWidget" name="TableWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>586</width> 
    <height>383</height> 
    </rect> 
    </property> 
    <property name="sizePolicy"> 
    <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> 
    <horstretch>0</horstretch> 
    <verstretch>0</verstretch> 
    </sizepolicy> 
    </property> 
    <property name="windowTitle"> 
    <string/> 
    </property> 
    <layout class="QGridLayout" name="gridLayout"> 
    <item row="0" column="0"> 
    <widget class="QTableWidget" name="tableWidget"/> 
    </item> 
    <item row="1" column="0"> 
    <widget class="QPushButton" name="btnSave"> 
    <property name="text"> 
     <string>Save to File</string> 
    </property> 
    </widget> 
    </item> 
    </layout> 
</widget> 
<resources/> 
<connections/> 
</ui> 

을 그리고 여기 pyuic4하여 .ui 파일에서 생성 된 파이썬 코드 :

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

# Form implementation generated from reading ui file 
'ui_table_window.ui' 
# 
# Created: Mon Apr 19 23:47:43 2010 
#  by: PyQt4 UI code generator 4.6 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

class Ui_TableWindow(object): 
    def setupUi(self, TableWindow): 
     TableWindow.setObjectName("TableWindow") 
     TableWindow.resize(586, 383) 
     sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, 
               QtGui.QSizePolicy.Expanding) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 

sizePolicy.setHeightForWidth(TableWindow.sizePolicy().hasHeightForWidth()) 
     TableWindow.setSizePolicy(sizePolicy) 
     self.gridLayout = QtGui.QGridLayout(TableWindow) 
     self.gridLayout.setObjectName("gridLayout") 
     self.tableWidget = QtGui.QTableWidget(TableWindow) 
     self.tableWidget.setObjectName("tableWidget") 
     self.tableWidget.setColumnCount(0) 
     self.tableWidget.setRowCount(0) 
     self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1) 
     self.btnSave = QtGui.QPushButton(TableWindow) 
     self.btnSave.setObjectName("btnSave") 
     self.gridLayout.addWidget(self.btnSave, 1, 0, 1, 1) 

     self.retranslateUi(TableWindow) 
     QtCore.QMetaObject.connectSlotsByName(TableWindow) 

    def retranslateUi(self, TableWindow): 
     self.btnSave.setText(QtGui.QApplication.translate("TableWindow", "Save to File", None, QtGui.QApplication.UnicodeUTF8)) 

사람이 내가 될 일을 볼 수 잘못하고있는거야?

답변

1

나는이 질문에 대한 답을 알고 싶습니다.

"반드시 설정해야합니다"는 도움이되지 않습니다.

해결!

부록 : 아래의 작업과 내용은 합법적입니다. 대화 상자/UI를 대화 상자 및/또는 위젯으로 만든 경우에는 적용됩니다. 그것은 그 자체로 탐침이있는 곳입니다

올바른 레이아웃을 만들고 원하는 양식 레이아웃을 제공하려면 ui 프로젝트를 "MainWindow"응용 프로그램으로 시작해야합니다. 버튼이나 위젯 앱이있는 대화 상자가 아닙니다. MainWindow 템플릿에는 "centralWidget"이 준비되어있어 레이아웃 옵션을 제공합니다. 만약 당신이하지 않았다면, 아래를 바꿀 것입니다.

pyuic4는이 부분에서 짧게 보입니다. 모든 UI를 래퍼 (wrapper)로 주 윈도우에 연결하는 방법은 오버랩 레이아웃으로 설정하여 모든 위젯을 마무리하는 것입니다. QGridLayout, QVerticalLayout, UI의 모든 내용이 최상위 레이아웃에서 "처리"되도록 중요하지 않습니다. 양식에 레이아웃을 적용하지 마십시오.

참고 : 일시적으로 QT 디자이너에서 "미리보기"를 사용할 수 있습니다. 그러나 이것이 바로 파이 변환이 손상된 부분입니다. 저장/변환하기 전에 서식의 레이아웃을 해제/제거해야합니다.

.UI 파일과 pyuic4을 사용하여 평 파일로 변환, 당신은 설정이 UI를 호출합니다 일반 모듈에서 이제 선 또는 두

from PyQt4 import QtCore, QtGui 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(625, 448) 

       <create a "holder" central widget> 
     self.widget = QtGui.QWidget() 

       <set the overall QLayout with the widget as the> 
       <parent rather than the "Dialog" that the> 
       <generated code gives you> 
     self.gridLayout_2 = QtGui.QGridLayout(self.widget) 

     self.gridLayout_2.setObjectName("gridLayout_2") 
     .... 
     .... 

을 추가/변경 objects.setCentralWidget() 함수가 필요합니다 그 위젯

if __name__ == "__main__": 
     app = QtGui.QApplication(sys.argv) 
     myapp = MyForm() 
     < set the widget inside the form to it's cetral widget > 
     myapp.setCentralWidget(myapp.ui.widget) 

     myapp.show() 
     sys.argv[1] = myapp.unUNCPath(sys.argv[1]) 
     os.chdir(sys.argv[1]) 
     myapp.setRootDir(sys.argv[1]) 
     myapp.processDirectory() 
     sys.exit(app.exec_()) 
1

당신이 가지고있는 것이 완벽하므로 설치 과정에 있어야합니다. 다음은 당신을 위해 일해야합니다 :

from PyQt4 import QtCore, QtGui 
from Ui_TableWindow import Ui_TableWindow # adjust accordingly 

class TableWindow(QtGui.QWidget, Ui_TableWindow): 
    def __init__(self, parent): 
     QtGui.QWidget.__init__(self, parent) 
     self.setupUi(self) 

if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = TableWindow(None) 
    window.show() 
    app.exec_() 
관련 문제