1

私はここで厄介な問題を抱えています.誰かが私が間違っていることについて洞察を与えることができれば幸いです.

数値の表を表示することになっている PyQt アプリがあります。当然、私は QTableWidget を使用しています。現時点では、非常に単純です。テーブル ウィジェットとボタンを含むウィンドウを作成し、それを表示するだけです。私はまだテーブルをまったく作成していません。

ウィンドウに合わせてテーブルのサイズを自動的に変更できるようにしたいのですが、最終的にはこのフォームに他のウィジェットを追加する予定なので、QGridLayout を使用しています。また、Qt Designer でフォームをプレビューすると、正しく表示され、正しく動作します。テーブルは、ボタンが使用するスペースを除くすべてのフォームを占有し、ウィンドウのサイズを変更すると、ウィンドウのサイズも一緒に正しくサイズ変更されます。しかし、生成された Python コードを実行しようとすると、すべてが台無しになります。テーブル ウィジェットとボタンは両方とも、ウィンドウの左上隅で、互いに重なり合って一緒にくしゃくしゃになっています。

Qt Designer 4 を使用して .ui ファイルを作成し、pyuic4 を使用して Python コードを生成しました。どちらのファイルも手動で編集していません。したがって、どちらにも基本的な構文エラーはないと思います。私の推測では、ウィジェット、ウィンドウ、およびレイアウト マネージャーの間の関係を何らかの形で誤解しています。しかし、私は方法を理解できません。

私の .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 ファイルから生成された Python コードは次のとおりです。

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

誰かが私が間違っているかもしれないことを見ることができますか?

4

2 に答える 2

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_()
于 2010-04-20T15:56:42.820 に答える
1

この質問の答えも知りたいです。

「それはあなたのセットアップにある必要があります」は何の助けにもなりません。

解決しました!

補遺: 以下のタスクとステートメントは正当です。ただし、ダイアログ/UI をダイアログおよび/またはウィジェットとして作成した場合は適用されます。それ自体が問題の場所です

適切なレイアウトが機能し、目的のフォーム レイアウトが得られるようにするには、UI プロジェクトを "MainWindow" アプリとして開始する必要があります。ボタン付きのダイアログやウィジェット アプリではありません。MainWindow テンプレートには「centralWidget」が用意されているため、レイアウト オプションが提供されます。そうでない場合は、以下でそれを変更するのに役立ちます

pyuic4 は、この 1 つの側面で不足しているようです。全体的な UI をメイン ウィンドウにフックするラッパーを提供する方法は、すべてのウィジェットを全体的なレイアウトに設定することによって完成させることです。QGridLayout、QVerticalLayout、それは重要ではなく、UI のすべてのコンテンツがトップレベルのレイアウトによって「処理」されるためです。フォームにレイアウトを適用しないでください。

注: QT Designer で「プレビュー」を使用できるようにするためだけに、一時的に使用したい場合があります。ただし、これはpy変換が壊れている場所です。保存/変換する前に、フォームのレイアウトを壊す/削除する必要があります

.ui ファイルを保存し、pyuic4 を使用して .py ファイルに変換したら、1 行または 2 行を追加/変更する必要があります。

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

通常のモジュールでは、この UI 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_())
于 2010-08-26T00:30:51.487 に答える