调整窗口大小时如何调整布局?

时间:2021-01-01 02:41:26

标签: python pyqt pyqt5

我是新手,我正在尝试制作一个可调整窗口大小的 GUI。我试图在调整窗口大小时扩展窗口内的内容。我尝试使用 layout thingy 但我无法让它工作。

这是我的完整代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Dialog(object):
    def setupUI2(self, Dialog):
        Dialog.resize(800, 600)

        self.widget = QtWidgets.QWidget(Dialog)
        self.widget.setGeometry(QtCore.QRect(10, 10, 781, 581))

        self.grup = QtWidgets.QVBoxLayout(self.widget)
        self.grup.setContentsMargins(0, 0, 0, 0)

        self.tableWidget = QtWidgets.QTableWidget(Dialog)
        self.tableWidget.setGeometry(QtCore.QRect(10, 10, 780, 520))
        self.tableWidget.setRowCount(1)
        self.tableWidget.setColumnCount(1)
        self.grup.addWidget(self.tableWidget)

        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(5)

        self.Tkolom = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.Tkolom.sizePolicy().hasHeightForWidth())
        self.Tkolom.setSizePolicy(sizePolicy)
        self.horizontalLayout.addWidget(self.Tkolom)

        self.Tbaris = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.Tbaris.sizePolicy().hasHeightForWidth())
        self.Tbaris.setSizePolicy(sizePolicy)
        self.horizontalLayout.addWidget(self.Tbaris)

        self.Hkolom = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.Hkolom.sizePolicy().hasHeightForWidth())
        self.Hkolom.setSizePolicy(sizePolicy)
        self.horizontalLayout.addWidget(self.Hkolom)

        self.Hbaris = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.Hbaris.sizePolicy().hasHeightForWidth())
        self.Hbaris.setSizePolicy(sizePolicy)
        self.horizontalLayout.addWidget(self.Hbaris)

        self.FS = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.FS.sizePolicy().hasHeightForWidth())
        self.FS.setSizePolicy(sizePolicy)
        self.horizontalLayout.addWidget(self.FS)

        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.kotaknama = QtWidgets.QLineEdit(self.widget)
        self.kotaknama.setEnabled(True)
        self.verticalLayout.addWidget(self.kotaknama)
        self.kotaknama.setMaxLength(60)

        self.Simpan = QtWidgets.QPushButton(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(self.Simpan.sizePolicy().hasHeightForWidth())
        self.Simpan.setSizePolicy(sizePolicy)
        self.verticalLayout.addWidget(self.Simpan)
        self.horizontalLayout.addLayout(self.verticalLayout)

        self.grup.addLayout(self.horizontalLayout)

        def tambahBaris():
            baris = self.tableWidget.rowCount()
            self.tableWidget.insertRow(baris)
        def tambahKolom():
            kolom = self.tableWidget.columnCount()
            self.tableWidget.insertColumn(kolom)
        def hapusBaris():
            if self.tableWidget.rowCount() > 1:
               self.tableWidget.removeRow(self.tableWidget.rowCount() - 1)
        def hapusKolom():
            if self.tableWidget.columnCount() > 1:
               self.tableWidget.removeColumn(self.tableWidget.columnCount() - 1)
        def full():
            Dialog.showMaximized()
        def shot():
            filename = self.kotaknama.text()
            if not filename.isalpha() and not filename.isdigit():
                filename = "Untitled"
            layar = QtWidgets.QApplication.primaryScreen()
            ss = layar.grabWindow(self.tableWidget.winId())
            ss.save(f"{filename}.jpg", 'jpg')

        self.Tbaris.clicked.connect(tambahBaris)
        self.Tkolom.clicked.connect(tambahKolom)
        self.Hbaris.clicked.connect(hapusBaris)
        self.Hkolom.clicked.connect(hapusKolom)
        self.FS.clicked.connect(full)
        self.Simpan.clicked.connect(shot)

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Catatan"))
        self.Tkolom.setText(_translate("Dialog", "Tambah Kolom"))
        self.Tbaris.setText(_translate("Dialog", "Tambah Baris"))
        self.Hkolom.setText(_translate("Dialog", "Hapus Kolom"))
        self.Hbaris.setText(_translate("Dialog", "Hapus Baris"))
        self.FS.setText(_translate("Dialog", "Fullscreen"))
        self.Simpan.setText(_translate("Dialog", "Simpan"))

if __name__ == "__main__":
    app3 = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUI2(Dialog)
    Dialog.show()
    sys.exit(app3.exec_())

我对此进行了说明以使其更清楚:

图一(正常运行:
normal run)

图片 2(调整大小后:
when resized)

图 3(我想做什么:
what im trying to do)

1 个答案:

答案 0 :(得分:1)

您必须明白,如果您希望小部件将其大小调整为容器,那么您必须使用布局,以及您如何使用 QtDesigner,那么以下 .ui 显示了解决方案:

design.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Dialog</class>
 <widget class="QDialog" name="Dialog">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>651</width>
    <height>445</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout_2">
   <item>
    <widget class="QTableWidget" name="tableWidget"/>
   </item>
   <item>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QPushButton" name="Tkolom">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Tambah Kolom</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="Tbaris">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Tambah Baris</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="Hkolom">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Hapus Kolom</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="Hbaris">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Hapus Baris</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="FS">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="text">
        <string>Fullscreen</string>
       </property>
      </widget>
     </item>
     <item>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <widget class="QLineEdit" name="kotaknama"/>
       </item>
       <item>
        <widget class="QPushButton" name="Simpan">
         <property name="text">
          <string>Simpan</string>
         </property>
        </widget>
       </item>
      </layout>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

然后,您必须使用 pyuic 将 .ui 转换为 .py,但不得如警告所示修改该文件:

pyuic5 design.ui -o design_ui.py -x

然后你必须创建你实现逻辑的主文件:

ma​​in.py

from PyQt5 import QtCore, QtGui, QtWidgets
import sys

from design_ui import Ui_Dialog


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.Tbaris.clicked.connect(self.tambahBaris)
        self.Tkolom.clicked.connect(self.tambahKolom)
        self.Hbaris.clicked.connect(self.hapusBaris)
        self.Hkolom.clicked.connect(self.hapusKolom)
        self.FS.clicked.connect(self.full)
        self.Simpan.clicked.connect(self.shot)

    def tambahBaris(self):
        baris = self.tableWidget.rowCount()
        self.tableWidget.insertRow(baris)

    def tambahKolom(self):
        kolom = self.tableWidget.columnCount()
        self.tableWidget.insertColumn(kolom)

    def hapusBaris(self):
        if self.tableWidget.rowCount() > 1:
            self.tableWidget.removeRow(self.tableWidget.rowCount() - 1)

    def hapusKolom(self):
        if self.tableWidget.columnCount() > 1:
            self.tableWidget.removeColumn(self.tableWidget.columnCount() - 1)

    def full(self):
        self.showMaximized()

    def shot(self):
        filename = self.kotaknama.text()
        if not filename.isalpha() and not filename.isdigit():
            filename = "Untitled"
        layar = QtWidgets.QApplication.primaryScreen()
        ss = layar.grabWindow(self.tableWidget.winId())
        ss.save(f"{filename}.jpg", "jpg")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())
相关问题