相关文章推荐
温柔的红薯  ·  Java中数组为null ...·  1 年前    · 
豁达的紫菜  ·  python logging ...·  1 年前    · 
越狱的鸵鸟  ·  unordered_map 与 map ...·  1 年前    · 

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

0 人关注

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

正如你从截图中可以看到的那样。

......标签似乎在单元格中垂直居中--但行编辑的位置很靠下,实际上已经超出了单元格的范围。

我怎样才能让行编辑在单元格中垂直对齐--与标签一样?或者更准确地说,我怎样才能让行编辑内的文本与标签内的文本一样大小和对齐?

test.ui :

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
    <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">
     <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">
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>

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()
    
python
pyqt5
sdbbs
sdbbs
发布于 2020-07-21
1 个回答
musicamante
musicamante
发布于 2020-07-21
已采纳
0 人赞同

The line edit is 垂直居中,或者至少它试图这样做:问题是你设置的最小高度大于项目的可用垂直空间,由于小部件太高,它不能移动到比它已经高的地方。

下面是给足空间后的样子。

但是,当可用空间小于行编辑高度时,结果就是这样。

请记住,虽然你在技术上可以使一个小组件比它的内容小,但原点会 始终 是左上角,无论为添加到它的布局中的孩子们设置什么对齐方式。

一个部分的解决方案是将布局的内容边距设置为0,这样单元格部件就能尽可能多地使用空间。

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