【问题标题】:I wanna set check box margin ? alignment我想设置复选框边距?结盟
【发布时间】:2021-05-21 09:02:31
【问题描述】:

我做了一些Qdialog,当我执行代码时,复选框没有对齐:

但我想要这样:

代码如下:

class SelectPay_Dialog2(Qdialog): 

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(500, 200, 400, 200)
        self.setWindowTitle("Window")


        label1 = QLabel("test  : ")
        label2 = QLabel("test  : ")
        label3 = QLabel("test : ")
        #
        label1.setFixedSize(80, 20)
        label2.setFixedSize(80, 20)
        label3.setFixedSize(80, 20)

        cb1 = QCheckBox('1week')
        cb2 = QCheckBox('2week')
        cb3 = QCheckBox('3week')
        cb4 = QCheckBox('4week')
        cb5 = QCheckBox('5week')
        cb6 = QCheckBox('6week')

        self.input_date_text1 = QLineEdit()
        self.input_date_text2 = QLineEdit()
        self.input_date_text1.setFixedSize(100, 25)
        self.input_date_text2.setFixedSize(100, 25)
        self.input_date_text1.setReadOnly(True)
        self.input_date_text2.setReadOnly(True)

        layout = QGridLayout()
        layout.addWidget(label1, 0, 0)
        layout.addWidget(label2, 2, 0)
        layout.addWidget(label3, 1, 0)

        layout.addWidget(self.input_date_text1, 2, 1)
        layout.addWidget(self.input_date_text2, 2, 2)
   
        layout.addWidget(cb1, 1, 1 )
        layout.addWidget(cb2, 1, 2 )
        layout.addWidget(cb3, 1, 3 )
        layout.addWidget(cb4, 1, 4)
        layout.addWidget(cb5, 1, 5)

        self.setLayout(layout)

【问题讨论】:

    标签: python checkbox pyqt5 qdialog


    【解决方案1】:

    顾名思义,QGridLayout 将项目放置在具有行和列的 grid 中。如果您更仔细地查看图像,您会发现前两个复选框与行编辑对齐。

    如果你不想要这种行为,那么你有不同的选择,它们都使用 QHBoxLayout:

    1. 根本不使用网格布局,而是使用QVBoxLayout作为主布局,并为每个“行”添加QHBoxLayout;这样做的缺点是第一个“列”可能未对齐,这似乎是您的情况的要求;
    2. 使用 QFormLayout,addRow 右侧有 QHBoxLayout;
    3. 添加具有正确列跨度的 QHBoxLayout;

    第三种情况可能对您通常在右侧“侧”有固定数量的小部件的情况很有用。
    将两行编辑视为“默认”布局安排,这就是您的情况:

        checkLayout = QHBoxLayout()
        layout.addLayout(checkLayout, 1, 1, 1, 3)
        checkLayout.addWidget(cb1)
        checkLayout.addWidget(cb2)
        checkLayout.addWidget(cb3)
        checkLayout.addWidget(cb4)
        checkLayout.addWidget(cb5)
    

    请注意,我使用的列跨度为 3。这确保了布局占用 3 列,并且由于实际上只有两列被占用(由行编辑),结果是剩余空间将仅用于复选框所需的 remaining 宽度。

    类似的相关解决方案需要将行编辑添加到它们自己的 QHBoxLayout,但还要在它们之后使用addStretch(),以便在它们的右侧保持空白。

    【讨论】:

    • 谢谢!!!我已经考虑了好几天了……效果很好!!
    【解决方案2】:

    对于复杂的布局,我推荐使用 Qt 设计器。您可以使用pyuic5 工具将使用它创建的ui 文件转换为python 代码。

    main.py

    from PyQt5 import QtWidgets, QtCore
    
    from Ui_SelectPay_Dialog2 import Ui_SelectPay_Dialog2
    
    class SelectPay_Dialog2(QtWidgets.QDialog):
        def __init__(self, parent = None):
            super().__init__(parent)
            ui = Ui_SelectPay_Dialog2()
            ui.setupUi(self)
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication([])
        widget = SelectPay_Dialog2()
        widget.show()
        app.exec_()
    

    Ui_SelectPay_Dialog2.py

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    class Ui_SelectPay_Dialog2(object):
        def setupUi(self, SelectPay_Dialog2):
            SelectPay_Dialog2.setObjectName("SelectPay_Dialog2")
            SelectPay_Dialog2.resize(432, 150)
            self.gridLayout = QtWidgets.QGridLayout(SelectPay_Dialog2)
            self.gridLayout.setObjectName("gridLayout")
            self.label = QtWidgets.QLabel(SelectPay_Dialog2)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
            self.label.setSizePolicy(sizePolicy)
            self.label.setObjectName("label")
            self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
            self.label_2 = QtWidgets.QLabel(SelectPay_Dialog2)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
            self.label_2.setSizePolicy(sizePolicy)
            self.label_2.setObjectName("label_2")
            self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
            self.horizontalLayout = QtWidgets.QHBoxLayout()
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.cb1 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb1.setObjectName("cb1")
            self.horizontalLayout.addWidget(self.cb1)
            self.cb2 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb2.setObjectName("cb2")
            self.horizontalLayout.addWidget(self.cb2)
            self.cb3 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb3.setObjectName("cb3")
            self.horizontalLayout.addWidget(self.cb3)
            self.cb4 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb4.setObjectName("cb4")
            self.horizontalLayout.addWidget(self.cb4)
            self.cb5 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb5.setObjectName("cb5")
            self.horizontalLayout.addWidget(self.cb5)
            self.cb6 = QtWidgets.QCheckBox(SelectPay_Dialog2)
            self.cb6.setObjectName("cb6")
            self.horizontalLayout.addWidget(self.cb6)
            self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1)
            self.label_3 = QtWidgets.QLabel(SelectPay_Dialog2)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
            self.label_3.setSizePolicy(sizePolicy)
            self.label_3.setObjectName("label_3")
            self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            self.input_date_text1 = QtWidgets.QLineEdit(SelectPay_Dialog2)
            self.input_date_text1.setObjectName("input_date_text1")
            self.horizontalLayout_2.addWidget(self.input_date_text1)
            self.input_date_text2 = QtWidgets.QLineEdit(SelectPay_Dialog2)
            self.input_date_text2.setObjectName("input_date_text2")
            self.horizontalLayout_2.addWidget(self.input_date_text2)
            spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem)
            self.gridLayout.addLayout(self.horizontalLayout_2, 2, 1, 1, 1)
            self.gridLayout.setRowStretch(0, 1)
            self.gridLayout.setRowStretch(1, 1)
            self.gridLayout.setRowStretch(2, 1)
    
            self.retranslateUi(SelectPay_Dialog2)
            QtCore.QMetaObject.connectSlotsByName(SelectPay_Dialog2)
    
        def retranslateUi(self, SelectPay_Dialog2):
            _translate = QtCore.QCoreApplication.translate
            SelectPay_Dialog2.setWindowTitle(_translate("SelectPay_Dialog2", "Form"))
            self.label.setText(_translate("SelectPay_Dialog2", "test  : "))
            self.label_2.setText(_translate("SelectPay_Dialog2", "test  : "))
            self.cb1.setText(_translate("SelectPay_Dialog2", "1week"))
            self.cb2.setText(_translate("SelectPay_Dialog2", "2week"))
            self.cb3.setText(_translate("SelectPay_Dialog2", "3week"))
            self.cb4.setText(_translate("SelectPay_Dialog2", "4week"))
            self.cb5.setText(_translate("SelectPay_Dialog2", "5week"))
            self.cb6.setText(_translate("SelectPay_Dialog2", "6week"))
            self.label_3.setText(_translate("SelectPay_Dialog2", "test  : "))
    
    

    dialog2.ui

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>SelectPay_Dialog2</class>
     <widget class="QDialog" name="SelectPay_Dialog2">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>432</width>
        <height>150</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Form</string>
      </property>
      <layout class="QGridLayout" name="gridLayout" rowstretch="1,1,1">
       <item row="0" column="0">
        <widget class="QLabel" name="label">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="text">
          <string>test  : </string>
         </property>
        </widget>
       </item>
       <item row="1" column="0">
        <widget class="QLabel" name="label_2">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="text">
          <string>test  : </string>
         </property>
        </widget>
       </item>
       <item row="1" column="1">
        <layout class="QHBoxLayout" name="horizontalLayout">
         <item>
          <widget class="QCheckBox" name="cb1">
           <property name="text">
            <string>1week</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cb2">
           <property name="text">
            <string>2week</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cb3">
           <property name="text">
            <string>3week</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cb4">
           <property name="text">
            <string>4week</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cb5">
           <property name="text">
            <string>5week</string>
           </property>
          </widget>
         </item>
         <item>
          <widget class="QCheckBox" name="cb6">
           <property name="text">
            <string>6week</string>
           </property>
          </widget>
         </item>
        </layout>
       </item>
       <item row="2" column="0">
        <widget class="QLabel" name="label_3">
         <property name="sizePolicy">
          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
           <horstretch>0</horstretch>
           <verstretch>0</verstretch>
          </sizepolicy>
         </property>
         <property name="text">
          <string>test  : </string>
         </property>
        </widget>
       </item>
       <item row="2" column="1">
        <layout class="QHBoxLayout" name="horizontalLayout_2">
         <item>
          <widget class="QLineEdit" name="input_date_text1"/>
         </item>
         <item>
          <widget class="QLineEdit" name="input_date_text2"/>
         </item>
         <item>
          <spacer name="horizontalSpacer">
           <property name="orientation">
            <enum>Qt::Horizontal</enum>
           </property>
           <property name="sizeHint" stdset="0">
            <size>
             <width>40</width>
             <height>20</height>
            </size>
           </property>
          </spacer>
         </item>
        </layout>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>
    

    【讨论】:

      【解决方案3】:

      你写layout.addWidget(cb1, 1, 1 )的地方你的括号间距与layout.addWidget(cb4, 1, 4)不同,使它们都相等,它应该修复它

      【讨论】:

      • 我只是想提供帮助,但考虑到你没有提供解决方案,我不知道你为什么这么粗鲁。也许看看图像,看看前 3 个是如何间隔的,而后两个与代码中的括号不同。
      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 2014-12-14
      • 2011-10-25
      • 2021-09-29
      • 2018-08-10
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多