Нужна помощь с PyQt и QGridLayout - PullRequest
1 голос
/ 20 апреля 2010

У меня здесь неприятно упрямая проблема, и я был бы признателен, если бы кто-нибудь мог дать мне некоторое представление о том, что я делаю неправильно.

У меня есть приложение PyQt, которое должно отображать таблицу чисел. Поэтому, естественно, я использую QTableWidget. Сейчас это очень просто: все, что я делаю, это создаю окно с виджетом таблицы и кнопкой и отображаю его. Я еще не заполняю таблицу.

Я хочу, чтобы таблица могла автоматически изменять размер вместе с окном, и в конце концов я собираюсь добавить другие виджеты в эту форму, поэтому я использую QGridLayout. И когда я просматриваю форму в Qt Designer, она выглядит и ведет себя правильно. Таблица занимает всю форму, за исключением пространства, используемого кнопкой, и когда я изменяю размер окна, они оба изменяют размер вместе с ним. Но когда я пытаюсь запустить сгенерированный код Python, он все испортил. Виджет таблицы и кнопка сжимаются друг над другом в верхнем левом углу окна.

Я создал файл .ui, используя Qt Designer 4, и сгенерировал код Python, используя 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>

А вот код Python, сгенерированный из файла .ui с помощью 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))

Кто-нибудь может увидеть, что я могу делать неправильно?

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Я бы тоже хотел узнать ответ на этот вопрос.

«Это должно быть в ваших настройках» - это ноль справки.

РЕШИТЬ!

Добавление: приведенные ниже задачи и утверждения являются законными. Однако они применяются, если вы создали свой диалог / пользовательский интерфейс в виде диалога и / или виджета. Это само по себе то, где лежит проблем

Чтобы верный макет работал и давал желаемый макет формы, вы должны запустить свой пользовательский интерфейс как приложение «MainWindow». Не диалог с кнопками или приложение Widget. Шаблон MainWindow поставляется с «CentralWidget», что дает вам возможность макета. Так что, если вы этого не сделали, ниже поможет вам изменить это

Кажется, что pyuic4 не хватает этого аспекта. Один из способов обернуть весь пользовательский интерфейс в основное окно - завершить все ваши виджеты, установив их в общий макет. QGridLayout, QVerticalLayout, это не имеет значения, просто для того, чтобы все содержимое пользовательского интерфейса «обрабатывалось» макетом верхнего уровня. НЕ применяйте макет к форме.

Примечание: вы можете временно использовать только «предварительный просмотр» в QT Designer. Однако это то, где преобразование py нарушается. Вам нужно будет разбить / удалить макет формы перед сохранением / преобразованием

Как только вы сохраните файл .ui и преобразуете его в свой файл .py с помощью pyuic4, вам нужно будет добавить / изменить одну или две строки

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 голос
/ 20 апреля 2010

То, что у вас работает, отлично работает, поэтому оно должно быть в вашей настройке Следующее должно работать для вас:

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