好的,我在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">
<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()
行编辑垂直居中,或者至少它尝试居中:问题是您设置的最小高度大于项目的可用垂直空间,并且由于小部件太高,它无法移动到比它已经高的位置
以下是在给定足够空间时的显示方式:
但是,当可用空间小于线编辑高度时,结果是:
请记住,虽然从技术上讲,您可以使小部件比其内容小,但无论为添加到其布局中的子部件设置了什么对齐方式,原点将始终位于左上方
部分解决方案是将版面的内容边距设置为0,以便单元格小部件能够使用尽可能多的空间:
但最终总会出现一些对齐问题,因此您可以避免为lineedit设置最小高度,也可以为垂直标题部分设置最小高度,从而为lineedit提供足够的空间:
相关问题 更多 >
编程相关推荐