在PyQt5的QTableWidget单元格中,QLineEdit在QWidget中垂直居中?

2024-09-20 15:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我在QtDesigner中放置了一个表小部件;然后我以编程方式尝试添加一个小部件,该小部件由标签和行编辑组成,作为该表中的一个单元格

从屏幕截图中可以看到:

pyqt5-table-with-widget

。。。标签似乎在单元格中垂直居中,但行编辑太低,实际上超出了单元格的边界

如何使行编辑与标签在单元格中垂直居中对齐?或者更准确地说-如何使行编辑中的文本与标签中的文本具有相同的大小和对齐方式

test.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <widget class="QTableWidget" name="tableWidget">
      <column>
       <property name="text">
        <string>Hello</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>World</string>
       </property>
      </column>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

test.py

import sys
from PyQt5 import QtCore, QtWidgets, QtGui, uic
from PyQt5.QtCore import pyqtSlot


class MyMainWindow(QtWidgets.QMainWindow):
  def __init__(self):
    super(MyMainWindow, self).__init__()
    uic.loadUi('test.ui', self)
    QtCore.QTimer.singleShot(1, self.delayed_init)
    self.show()

  def delayed_init(self):
    # stretch the column widths manually - must be in delayed_init, in __init__ table does not yet know its own width
    numcols = self.tableWidget.columnCount()
    newcolwidth = int( self.tableWidget.width()/numcols )
    for i in range(numcols):
      self.tableWidget.setColumnWidth(i, newcolwidth) # SO:46715061
    # test - add cell
    self.tableWidget.setRowCount(2)
    linewidget = QtWidgets.QWidget(self.tableWidget)
    linelayout = QtWidgets.QHBoxLayout()
    linewidget.setLayout(linelayout)
    linelbl1 = QtWidgets.QLabel()
    linelbl1.setText("Hello ")
    lineedit = QtWidgets.QLineEdit(linewidget)
    lineedit.setSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding)
    lineedit.setMinimumHeight( self.tableWidget.verticalHeader().minimumSectionSize() + 10 )
    lineedit.setMaximumWidth( 30 )
    lineedit.setMaxLength( 3 ) # 3 characters
    linelbl2 = QtWidgets.QLabel()
    linelbl2.setText(" buddy")
    linelayout.addWidget(linelbl1)
    linelayout.addWidget(lineedit, QtCore.Qt.AlignCenter)
    linelayout.addWidget(linelbl2)
    self.tableWidget.setCellWidget(0, 1, linewidget)



def main():
  app = QtWidgets.QApplication(sys.argv)
  window = MyMainWindow()
  sys.exit(app.exec_())

if __name__ == "__main__":
  main()

Tags: nameself编辑stringinitcolumnproperty标签
1条回答
网友
1楼 · 发布于 2024-09-20 15:34:23

行编辑垂直居中,或者至少它尝试居中:问题是您设置的最小高度大于项目的可用垂直空间,并且由于小部件太高,它无法移动到比它已经高的位置

以下是在给定足够空间时的显示方式:

optimal size

但是,当可用空间小于线编辑高度时,结果是:

not very good

请记住,虽然从技术上讲,您可以使小部件比其内容小,但无论为添加到其布局中的子部件设置了什么对齐方式,原点将始终位于左上方

部分解决方案是将版面的内容边距设置为0,以便单元格小部件能够使用尽可能多的空间:

    linelayout.setContentsMargins(0, 0, 0, 0)

但最终总会出现一些对齐问题,因此您可以避免为lineedit设置最小高度,也可以为垂直标题部分设置最小高度,从而为lineedit提供足够的空间:

    lineedit.setMinimumHeight(self.tableWidget.verticalHeader().defaultSectionSize() + 10)
    # ...
    self.tableWidget.verticalHeader().setDefaultSectionSize(linewidget.sizeHint().height())

相关问题 更多 >

    热门问题