2010-04-20 8 views
1

J'ai un problème ennuyeux ici, et j'apprécierais que quelqu'un puisse me donner un aperçu de ce que je fais de mal.Besoin d'aide avec PyQt et QGridLayout

J'ai une application PyQt censée afficher une table de nombres. Donc, naturellement, j'utilise QTableWidget. En ce moment, c'est extrêmement simple: tout ce que je fais est de créer une fenêtre avec un widget de table et un bouton et de l'afficher. Je ne suis pas encore en train de peupler la table. Je veux que la table puisse être redimensionnée automatiquement avec la fenêtre, et éventuellement je vais ajouter d'autres widgets à ce formulaire, donc j'utilise QGridLayout. Et quand je prévisualiser le formulaire dans Qt Designer, il semble et se comporte correctement. La table prend tout le formulaire à l'exception de l'espace utilisé par le bouton, et quand je redimensionne la fenêtre, ils sont tous deux correctement redimensionnés avec lui. Mais quand j'essaye d'exécuter le code Python généré, tout est foutu. Le widget de tableau et le bouton sont tous deux regroupés les uns sur les autres dans le coin supérieur gauche de la fenêtre.

J'ai créé le fichier .ui à l'aide de Qt Designer 4 et généré le code Python à l'aide de pyuic4. Je n'ai pas édité l'un des fichiers manuellement du tout. Donc, je suppose qu'il n'y a pas d'erreurs de syntaxe de base dans l'un ou l'autre. Ma conjecture est que je suis en quelque sorte mal compris la relation entre les widgets, la fenêtre et le gestionnaire de mise en page. Mais je ne peux pas comprendre comment.

Voici le code pour mon fichier .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> 

Et voici le code Python généré à partir du fichier .ui par pyuic4:

# -*- 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)) 

Quelqu'un peut-il voir ce que je pourrais être mal faire?

Répondre

1

Je voudrais aussi connaître la réponse à cette question.

"Il doit être dans votre configuration" est aucune aide.

RÉSOLU!

Addendum: Les tâches et les instructions ci-dessous sont légitimes. Cependant, ils s'appliquent si vous avez créé votre boîte de dialogue/interface utilisateur en tant que boîte de dialogue et/ou widget. C'est en soi que réside le problème

Pour que la mise en page fonctionne et que vous obteniez la disposition de formulaire souhaitée, vous devez démarrer votre projet ui en tant qu'application "MainWindow". Pas le dialogue avec les boutons ou l'application Widget. Le modèle MainWindow est préparé avec un "centralWidget", donnant ainsi votre option de mise en page. Donc, si vous n'avez pas, ci-dessous vous aidera à changer cela

Il semble que pyuic4 est à court de cet aspect. Une façon de donner à l'ui un wrapper dans la fenêtre principale est de finaliser tous vos widgets en les plaçant dans une mise en page générale. QGridLayout, QVerticalLayout, ça n'a pas d'importance, juste pour que tout le contenu de l'interface utilisateur soit "géré" par une mise en page de haut niveau. N'appliquez PAS de disposition au formulaire.

Remarque: Vous souhaiterez peut-être temporairement utiliser l'aperçu dans QT Designer. Cependant, c'est là que la conversion py est cassée. Vous devrez casser/supprimer la disposition du formulaire avant de sauvegarder/convertir

Une fois que vous enregistrez le fichier.fichier ui et le convertir dans votre fichier .py en utilisant pyuic4, vous devrez ajouter/modifier une ligne ou deux

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") 
     .... 
     .... 

maintenant dans les modules normaux vous appeler cette interface fonction objects.setCentralWidget() pour définir ce widget

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

Ce que vous avez fonctionne parfaitement, il doit donc être dans votre configuration. Ce qui suit devrait fonctionner pour vous:

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_()