如何使 QTreeView 显示超过 10 行
How to make a QTreeView display more than 10 lines
在 Win10 上使用 Python 3.7 和 pyqt5
我正在努力获得一个使用 QStandardItemModel 来显示超过 10 行的 QTreeView。我希望它显示该区域实际可以处理的最大行数,但由于某些未知原因(至少对我而言)它在 10 处停止。
我已经尝试了很多解决方案(一些我已经在下面的代码中注明了它们的明显结果)还有一些我没有包括在内,因为它们没有编译。到目前为止,我似乎无法找到一种方法来让 QTreeView 填充可用的 space and/or 显示所有行它可以只停在 10 行。我包括一个运行并显示问题的程序,只需单击 "Options",然后单击 "Option 1"
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Line(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
# Users Widget *************************************************
class Disply1(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.header = QVBoxLayout()
Title = QLabel()
Title.setStyleSheet('font: bold 14px')
Title.setText('Option 1 Configuration Settings')
self.header.addWidget(Title)
self.header.addWidget(Line(self))
# -------
self.TreeVew = QTreeView()
self.TreeVew.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.TreeVew.setAlternatingRowColors(True)
# This adjustment did not fix it
# self.TreeVew.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
# This adjustment made it worse
# self.TreeVew.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.model = QStandardItemModel(0, 6)
self.model.setHorizontalHeaderLabels([' ', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'])
self.model.setHeaderData(5, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
# This adjustment did not fix it
# self.model.setRowCount(20)
self.TreeVew.setModel(self.model)
self.TreeVew.setColumnWidth(0, 1)
self.TreeVew.setColumnHidden(0, True)
self.TreeVew.header().setSectionResizeMode(0, QHeaderView.Fixed)
self.TreeVew.header().setStretchLastSection(False)
self.TreeVew.header().setSectionResizeMode(1, QHeaderView.Stretch)
self.TreeVew.setColumnWidth(2, 100)
self.TreeVew.setColumnWidth(3, 100)
self.TreeVew.setColumnWidth(4, 100)
self.TreeVew.setColumnWidth(5, 70)
# This adjustment did not fix it
# self.TreeVew.resize(self.sizeHint().width(), self.maximumHeight())
ItmRecSet = [
{'Id':'01', 'Column1':'R01-C1', 'Column2':'R01-C2', 'Column3':'R01-C3', 'Column4':'R01-C5', 'Column5':'R01-C5'},
{'Id':'02', 'Column1':'R02-C1', 'Column2':'R02-C2', 'Column3':'R02-C3', 'Column4':'R02-C5', 'Column5':'R02-C5'},
{'Id':'03', 'Column1':'R03-C1', 'Column2':'R03-C2', 'Column3':'R03-C3', 'Column4':'R03-C5', 'Column5':'R03-C5'},
{'Id':'04', 'Column1':'R04-C1', 'Column2':'R04-C2', 'Column3':'R04-C3', 'Column4':'R04-C5', 'Column5':'R04-C5'},
{'Id':'05', 'Column1':'R05-C1', 'Column2':'R05-C2', 'Column3':'R05-C3', 'Column4':'R05-C5', 'Column5':'R05-C5'},
{'Id':'06', 'Column1':'R06-C1', 'Column2':'R06-C2', 'Column3':'R06-C3', 'Column4':'R06-C5', 'Column5':'R06-C5'},
{'Id':'07', 'Column1':'R07-C1', 'Column2':'R07-C2', 'Column3':'R07-C3', 'Column4':'R07-C5', 'Column5':'R07-C5'},
{'Id':'08', 'Column1':'R08-C1', 'Column2':'R08-C2', 'Column3':'R08-C3', 'Column4':'R08-C5', 'Column5':'R08-C5'},
{'Id':'09', 'Column1':'R09-C1', 'Column2':'R09-C2', 'Column3':'R09-C3', 'Column4':'R09-C5', 'Column5':'R09-C5'},
{'Id':'10', 'Column1':'R10-C1', 'Column2':'R10-C2', 'Column3':'R10-C3', 'Column4':'R10-C5', 'Column5':'R10-C5'},
{'Id':'11', 'Column1':'R11-C1', 'Column2':'R11-C2', 'Column3':'R11-C3', 'Column4':'R11-C5', 'Column5':'R11-C5'},
{'Id':'12', 'Column1':'R12-C1', 'Column2':'R12-C2', 'Column3':'R12-C3', 'Column4':'R12-C5', 'Column5':'R12-C5'},
{'Id':'13', 'Column1':'R13-C1', 'Column2':'R13-C2', 'Column3':'R13-C3', 'Column4':'R13-C5', 'Column5':'R13-C5'},
{'Id':'14', 'Column1':'R14-C1', 'Column2':'R14-C2', 'Column3':'R14-C3', 'Column4':'R14-C5', 'Column5':'R14-C5'},
{'Id':'15', 'Column1':'R15-C1', 'Column2':'R15-C2', 'Column3':'R15-C3', 'Column4':'R15-C5', 'Column5':'R15-C5'},
{'Id':'16', 'Column1':'R16-C1', 'Column2':'R16-C2', 'Column3':'R16-C3', 'Column4':'R16-C5', 'Column5':'R16-C5'},
{'Id':'17', 'Column1':'R17-C1', 'Column2':'R17-C2', 'Column3':'R17-C3', 'Column4':'R17-C5', 'Column5':'R17-C5'},
{'Id':'18', 'Column1':'R18-C1', 'Column2':'R18-C2', 'Column3':'R18-C3', 'Column4':'R18-C5', 'Column5':'R18-C5'},
{'Id':'19', 'Column1':'R19-C1', 'Column2':'R19-C2', 'Column3':'R19-C3', 'Column4':'R19-C5', 'Column5':'R19-C5'},
{'Id':'20', 'Column1':'R20-C1', 'Column2':'R20-C2', 'Column3':'R20-C3', 'Column4':'R20-C5', 'Column5':'R20-C5'}
]
self.model.setRowCount(0)
for Item in ItmRecSet:
Itm1 = QStandardItem(Item['Id'])
Itm1.setTextAlignment(Qt.AlignLeft)
Itm1.isEditable = False
Itm2 = QStandardItem(Item['Column1'])
Itm2.setTextAlignment(Qt.AlignLeft)
Itm2.isEditable = False
Itm3 = QStandardItem(Item['Column2'])
Itm3.setTextAlignment(Qt.AlignLeft)
Itm3.isEditable = False
Itm4 = QStandardItem(Item['Column3'])
Itm4.setTextAlignment(Qt.AlignLeft)
Itm4.isEditable = False
Itm5 = QStandardItem(Item['Column4'])
Itm5.setTextAlignment(Qt.AlignLeft)
Itm5.isEditable = False
Itm6 = QStandardItem(Item['Column5'])
Itm6.setTextAlignment(Qt.AlignCenter)
Itm6.isEditable = False
self.model.appendRow([Itm1, Itm2, Itm3, Itm4, Itm5, Itm6])
# Using this GridLayout versus the VerticalBox did not fix it
# self.Cntnr = QGridLayout()
# -------
# self.Cntnr.addLayout(self.header,0,0)
# self.Cntnr.addWidget(self.TreeVew,1,0)
# self.Cntnr.setRowStretch(2,4)
self.Cntnr = QVBoxLayout()
self.Cntnr.addLayout(self.header)
self.Cntnr.addWidget(self.TreeVew)
# If this stretch is not included only the header gets stretched the QTreeView still only shows 10 lines
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
# Debug Widget *************************************************
class Disply2(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.Cntnr = QVBoxLayout()
self.Cntnr.addWidget(QTextEdit('Option 2 Settings Shown Here'))
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
class OptionButtons(QToolButton):
# Class OptionButtons ("Text", Icon, Connector) inherits from QToolButton
def __init__(self, Text, Icon, Connector):
QToolButton.__init__(self)
self.setText(Text)
self.setIcon(Icon)
self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.setStyleSheet("font: bold;color: blue;height: 55px;width: 55px;")
self.setIconSize(QSize(32,32))
self.clicked.connect(Connector)
############################## Settings Class ##############################
class OptionSettings(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
line = QFrame()
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
# Button Area on Left
# Button 1 *************************************************
self.btnOptn1 = OptionButtons('Option1', QIcon('images/opt1.ico'), self.ShowDisply1)
# Button 2 *************************************************
self.btnOptn2 = OptionButtons('Option2', QIcon('images/opt2.ico'), self.ShowDisply2)
# Vertical Box for Buttons *************************************
self.UpLeft = QVBoxLayout()
self.UpLeft.addWidget(self.btnOptn1)
self.UpLeft.addWidget(self.btnOptn2)
self.UpLeft.addStretch(1)
# Display Area on Right
# Widget Flip Display ******************************************
self.UpRite = QHBoxLayout()
self.Contents = QStackedWidget()
self.Contents.addWidget(QTextEdit('Nothing Selected'))
self.Contents.addWidget(Disply1(self))
self.Contents.addWidget(Disply2(self))
self.Contents.addWidget(QTextEdit('Settings Saved'))
self.Contents.setCurrentIndex(0)
self.UpRite.addWidget(self.Contents)
# Button and Display Area on Top
self.Upper = QHBoxLayout()
self.Upper.addLayout(self.UpLeft)
self.Upper.addLayout(self.UpRite)
# Save and Cancel Area on Bottom
self.btnSave = QPushButton("Save")
self.btnSave.clicked.connect(self.SaveSettings)
self.btnCncl = QPushButton("Cancel")
self.btnCncl.clicked.connect(self.close)
self.Lower = QHBoxLayout()
self.Lower.addStretch(1)
self.Lower.addWidget(self.btnSave)
self.Lower.addWidget(self.btnCncl)
# Entire Options Window Layout
self.OuterBox = QVBoxLayout()
self.OuterBox.addLayout(self.Upper)
self.OuterBox.addLayout(self.Lower)
self.setLayout(self.OuterBox)
self.setWindowTitle('Settings')
#Geometry(Left, Top, Width, Hight)
self.setGeometry(250, 250, 550, 450)
self.setModal(True)
self.exec()
def ShowDisply1(self):
self.Contents.setCurrentIndex(1)
def ShowDisply2(self):
self.Contents.setCurrentIndex(2)
def SaveSettings(self):
self.Contents.setCurrentIndex(3)
class CustomItemModel(QStandardItemModel):
def headerData(self, section, orientation, role):
if role == Qt.ForegroundRole:
brush = QBrush()
brush.setColor(Qt.blue)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.BackgroundRole:
brush = QBrush()
brush.setColor(Qt.yellow)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.FontRole:
font = QFont()
font.setBold(True)
font.setPointSize(10)
return font
return super().headerData(section, orientation, role)
class ItemDsplyr(QTreeView):
def __init__(self, CentrPane):
QTreeView.__init__(self, CentrPane)
self.CntrPane = CentrPane
self.setEditTriggers(QTreeView().NoEditTriggers)
self.model = CustomItemModel(0, 3)
self.model.setHorizontalHeaderLabels(['1st Col', '2nd Col', '3rd Col'])
self.model.setHeaderData(1, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
self.setModel(self.model)
self.setMinimumWidth(250)
self.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.header().setStretchLastSection(False)
self.header().setSectionResizeMode(0, QHeaderView.Stretch)
self.setColumnWidth(1, 75)
self.setColumnWidth(2, 100)
class CenterPanel(QWidget):
def __init__(self, MainWin):
QWidget.__init__(self)
self.MyEditor = QTextEdit('Editorial')
self.ItemDsply = ItemDsplyr(self)
CntrPane = QSplitter(Qt.Horizontal, self)
CntrPane.addWidget(self.MyEditor)
CntrPane.addWidget(self.ItemDsply)
CntrPane.setSizes([50,200])
CntrPane.setCollapsible(0, False)
CntrPane.setCollapsible(1, False)
hbox = QHBoxLayout(self)
hbox.addWidget(CntrPane)
self.setLayout(hbox)
class MenuToolBar(QDockWidget):
def __init__(self, MainWin):
QDockWidget.__init__(self)
self.MainWin = MainWin
self.MainMenu = MainWin.menuBar()
self.WndowMenu = self.MainMenu.addMenu('Windows')
self.OptnAct = QAction('Options', self)
self.OptnAct.setStatusTip('Open the Options Window')
self.OptnAct.triggered.connect(MainWin.ShowOptions)
self.WndowMenu.addAction(self.OptnAct)
self.InitToolBar(MainWin)
def InitToolBar(self, MainWin):
self.mainToolBar = MainWin.addToolBar("Quick Access")
self.mainToolBar.addAction(self.OptnAct)
class UI_MainWindow(QMainWindow):
def __init__(self, MainDesktop):
super(UI_MainWindow, self).__init__(MainDesktop)
self.setWindowTitle('Main Window')
self.MnDskTop = MainDesktop
# Left, Top, Width, Height
self.setGeometry(200, 200, 550, 550)
self.CenterPane = CenterPanel(self)
self.setCentralWidget(self.CenterPane)
self.MenuToolBar = MenuToolBar(self)
def ShowOptions(self):
self.Options = OptionSettings(self)
if __name__ == '__main__':
MainApp = QApplication([])
MainGui = UI_MainWindow(MainApp.desktop())
MainGui.show()
sysExit(MainApp.exec_())
同样,我所期望的是 QTreeView 将填充可用的 space and/or 在给定的 space 中显示尽可能多的行。但是,如前所述,它会很快停止并且最多只显示 10 行。
我删除了行 self.Cntnr.addStretch(1)
,结果是这样的:
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Line(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
# Users Widget *************************************************
class Disply1(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.header = QVBoxLayout()
Title = QLabel()
Title.setStyleSheet('font: bold 14px')
Title.setText('Option 1 Configuration Settings')
self.header.addWidget(Title)
self.header.addWidget(Line(self))
# -------
self.TreeVew = QTreeView()
self.TreeVew.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.TreeVew.setAlternatingRowColors(True)
# This adjustment did not fix it
# self.TreeVew.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
# This adjustment made it worse
# self.TreeVew.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.model = QStandardItemModel(0, 6)
self.model.setHorizontalHeaderLabels([' ', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'])
self.model.setHeaderData(5, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
# This adjustment did not fix it
# self.model.setRowCount(20)
self.TreeVew.setModel(self.model)
self.TreeVew.setColumnWidth(0, 1)
self.TreeVew.setColumnHidden(0, True)
self.TreeVew.header().setSectionResizeMode(0, QHeaderView.Fixed)
self.TreeVew.header().setStretchLastSection(False)
self.TreeVew.header().setSectionResizeMode(1, QHeaderView.Stretch)
self.TreeVew.setColumnWidth(2, 100)
self.TreeVew.setColumnWidth(3, 100)
self.TreeVew.setColumnWidth(4, 100)
self.TreeVew.setColumnWidth(5, 70)
# This adjustment did not fix it
# self.TreeVew.resize(self.sizeHint().width(), self.maximumHeight())
#@ self.TreeVew.resize(400, 600)
ItmRecSet = [
{'Id':'01', 'Column1':'R01-C1', 'Column2':'R01-C2', 'Column3':'R01-C3', 'Column4':'R01-C5', 'Column5':'R01-C5'},
{'Id':'02', 'Column1':'R02-C1', 'Column2':'R02-C2', 'Column3':'R02-C3', 'Column4':'R02-C5', 'Column5':'R02-C5'},
{'Id':'03', 'Column1':'R03-C1', 'Column2':'R03-C2', 'Column3':'R03-C3', 'Column4':'R03-C5', 'Column5':'R03-C5'},
{'Id':'04', 'Column1':'R04-C1', 'Column2':'R04-C2', 'Column3':'R04-C3', 'Column4':'R04-C5', 'Column5':'R04-C5'},
{'Id':'05', 'Column1':'R05-C1', 'Column2':'R05-C2', 'Column3':'R05-C3', 'Column4':'R05-C5', 'Column5':'R05-C5'},
{'Id':'06', 'Column1':'R06-C1', 'Column2':'R06-C2', 'Column3':'R06-C3', 'Column4':'R06-C5', 'Column5':'R06-C5'},
{'Id':'07', 'Column1':'R07-C1', 'Column2':'R07-C2', 'Column3':'R07-C3', 'Column4':'R07-C5', 'Column5':'R07-C5'},
{'Id':'08', 'Column1':'R08-C1', 'Column2':'R08-C2', 'Column3':'R08-C3', 'Column4':'R08-C5', 'Column5':'R08-C5'},
{'Id':'09', 'Column1':'R09-C1', 'Column2':'R09-C2', 'Column3':'R09-C3', 'Column4':'R09-C5', 'Column5':'R09-C5'},
{'Id':'10', 'Column1':'R10-C1', 'Column2':'R10-C2', 'Column3':'R10-C3', 'Column4':'R10-C5', 'Column5':'R10-C5'},
{'Id':'11', 'Column1':'R11-C1', 'Column2':'R11-C2', 'Column3':'R11-C3', 'Column4':'R11-C5', 'Column5':'R11-C5'},
{'Id':'12', 'Column1':'R12-C1', 'Column2':'R12-C2', 'Column3':'R12-C3', 'Column4':'R12-C5', 'Column5':'R12-C5'},
{'Id':'13', 'Column1':'R13-C1', 'Column2':'R13-C2', 'Column3':'R13-C3', 'Column4':'R13-C5', 'Column5':'R13-C5'},
{'Id':'14', 'Column1':'R14-C1', 'Column2':'R14-C2', 'Column3':'R14-C3', 'Column4':'R14-C5', 'Column5':'R14-C5'},
{'Id':'15', 'Column1':'R15-C1', 'Column2':'R15-C2', 'Column3':'R15-C3', 'Column4':'R15-C5', 'Column5':'R15-C5'},
{'Id':'16', 'Column1':'R16-C1', 'Column2':'R16-C2', 'Column3':'R16-C3', 'Column4':'R16-C5', 'Column5':'R16-C5'},
{'Id':'17', 'Column1':'R17-C1', 'Column2':'R17-C2', 'Column3':'R17-C3', 'Column4':'R17-C5', 'Column5':'R17-C5'},
{'Id':'18', 'Column1':'R18-C1', 'Column2':'R18-C2', 'Column3':'R18-C3', 'Column4':'R18-C5', 'Column5':'R18-C5'},
{'Id':'19', 'Column1':'R19-C1', 'Column2':'R19-C2', 'Column3':'R19-C3', 'Column4':'R19-C5', 'Column5':'R19-C5'},
{'Id':'20', 'Column1':'R20-C1', 'Column2':'R20-C2', 'Column3':'R20-C3', 'Column4':'R20-C5', 'Column5':'R20-C5'}
]
self.model.setRowCount(0)
for Item in ItmRecSet:
Itm1 = QStandardItem(Item['Id'])
Itm1.setTextAlignment(Qt.AlignLeft)
Itm1.isEditable = False
Itm2 = QStandardItem(Item['Column1'])
Itm2.setTextAlignment(Qt.AlignLeft)
Itm2.isEditable = False
Itm3 = QStandardItem(Item['Column2'])
Itm3.setTextAlignment(Qt.AlignLeft)
Itm3.isEditable = False
Itm4 = QStandardItem(Item['Column3'])
Itm4.setTextAlignment(Qt.AlignLeft)
Itm4.isEditable = False
Itm5 = QStandardItem(Item['Column4'])
Itm5.setTextAlignment(Qt.AlignLeft)
Itm5.isEditable = False
Itm6 = QStandardItem(Item['Column5'])
Itm6.setTextAlignment(Qt.AlignCenter)
Itm6.isEditable = False
self.model.appendRow([Itm1, Itm2, Itm3, Itm4, Itm5, Itm6])
# Using this GridLayout versus the VerticalBox did not fix it
# self.Cntnr = QGridLayout()
# -------
# self.Cntnr.addLayout(self.header,0,0)
# self.Cntnr.addWidget(self.TreeVew,1,0)
# self.Cntnr.setRowStretch(2,4)
self.Cntnr = QVBoxLayout()
self.Cntnr.addLayout(self.header)
self.Cntnr.addWidget(self.TreeVew)
# If this stretch is not included only the header gets stretched the QTreeView still only shows 10 lines
#--- self.Cntnr.addStretch(1) # <<<=======
# -------
self.setLayout(self.Cntnr)
# Debug Widget *************************************************
class Disply2(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.Cntnr = QVBoxLayout()
self.Cntnr.addWidget(QTextEdit('Option 2 Settings Shown Here'))
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
class OptionButtons(QToolButton):
# Class OptionButtons ("Text", Icon, Connector) inherits from QToolButton
def __init__(self, Text, Icon, Connector):
QToolButton.__init__(self)
self.setText(Text)
self.setIcon(Icon)
self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.setStyleSheet("font: bold;color: blue;height: 55px;width: 55px;")
self.setIconSize(QSize(32,32))
self.clicked.connect(Connector)
############################## Settings Class ##############################
class OptionSettings(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
line = QFrame()
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
# Button Area on Left
# Button 1 *************************************************
self.btnOptn1 = OptionButtons('Option1', QIcon('Ok.png'), self.ShowDisply1)
# Button 2 *************************************************
self.btnOptn2 = OptionButtons('Option2', QIcon('images/opt2.ico'), self.ShowDisply2)
# Vertical Box for Buttons *************************************
self.UpLeft = QVBoxLayout()
self.UpLeft.addWidget(self.btnOptn1)
self.UpLeft.addWidget(self.btnOptn2)
self.UpLeft.addStretch(1)
# Display Area on Right
# Widget Flip Display ******************************************
self.UpRite = QHBoxLayout()
self.Contents = QStackedWidget()
self.Contents.addWidget(QTextEdit('Nothing Selected'))
self.Contents.addWidget(Disply1(self))
self.Contents.addWidget(Disply2(self))
self.Contents.addWidget(QTextEdit('Settings Saved'))
self.Contents.setCurrentIndex(0)
self.UpRite.addWidget(self.Contents)
# Button and Display Area on Top
self.Upper = QHBoxLayout()
self.Upper.addLayout(self.UpLeft)
self.Upper.addLayout(self.UpRite)
# Save and Cancel Area on Bottom
self.btnSave = QPushButton("Save")
self.btnSave.clicked.connect(self.SaveSettings)
self.btnCncl = QPushButton("Cancel")
self.btnCncl.clicked.connect(self.close)
self.Lower = QHBoxLayout()
self.Lower.addStretch(1)
self.Lower.addWidget(self.btnSave)
self.Lower.addWidget(self.btnCncl)
# Entire Options Window Layout
self.OuterBox = QVBoxLayout()
self.OuterBox.addLayout(self.Upper)
self.OuterBox.addLayout(self.Lower)
self.setLayout(self.OuterBox)
self.setWindowTitle('Settings')
#Geometry(Left, Top, Width, Hight)
self.setGeometry(250, 250, 550, 450)
self.setModal(True)
self.exec()
def ShowDisply1(self):
self.Contents.setCurrentIndex(1)
def ShowDisply2(self):
self.Contents.setCurrentIndex(2)
def SaveSettings(self):
self.Contents.setCurrentIndex(3)
class CustomItemModel(QStandardItemModel):
def headerData(self, section, orientation, role):
if role == Qt.ForegroundRole:
brush = QBrush()
brush.setColor(Qt.blue)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.BackgroundRole:
brush = QBrush()
brush.setColor(Qt.yellow)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.FontRole:
font = QFont()
font.setBold(True)
font.setPointSize(10)
return font
return super().headerData(section, orientation, role)
class ItemDsplyr(QTreeView):
def __init__(self, CentrPane):
QTreeView.__init__(self, CentrPane)
self.CntrPane = CentrPane
self.setEditTriggers(QTreeView().NoEditTriggers)
self.model = CustomItemModel(0, 3)
self.model.setHorizontalHeaderLabels(['1st Col', '2nd Col', '3rd Col'])
self.model.setHeaderData(1, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
self.setModel(self.model)
self.setMinimumWidth(250)
self.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.header().setStretchLastSection(False)
self.header().setSectionResizeMode(0, QHeaderView.Stretch)
self.setColumnWidth(1, 75)
self.setColumnWidth(2, 100)
class CenterPanel(QWidget):
def __init__(self, MainWin):
QWidget.__init__(self)
self.MyEditor = QTextEdit('Editorial')
self.ItemDsply = ItemDsplyr(self)
CntrPane = QSplitter(Qt.Horizontal, self)
CntrPane.addWidget(self.MyEditor)
CntrPane.addWidget(self.ItemDsply)
CntrPane.setSizes([50,200])
CntrPane.setCollapsible(0, False)
CntrPane.setCollapsible(1, False)
hbox = QHBoxLayout(self)
hbox.addWidget(CntrPane)
self.setLayout(hbox)
class MenuToolBar(QDockWidget):
def __init__(self, MainWin):
QDockWidget.__init__(self)
self.MainWin = MainWin
self.MainMenu = MainWin.menuBar()
self.WndowMenu = self.MainMenu.addMenu('Windows')
self.OptnAct = QAction('Options', self)
self.OptnAct.setStatusTip('Open the Options Window')
self.OptnAct.triggered.connect(MainWin.ShowOptions)
self.WndowMenu.addAction(self.OptnAct)
self.InitToolBar(MainWin)
def InitToolBar(self, MainWin):
self.mainToolBar = MainWin.addToolBar("Quick Access")
self.mainToolBar.addAction(self.OptnAct)
class UI_MainWindow(QMainWindow):
def __init__(self, MainDesktop):
super(UI_MainWindow, self).__init__(MainDesktop)
self.setWindowTitle('Main Window')
self.MnDskTop = MainDesktop
# Left, Top, Width, Height
self.setGeometry(200, 200, 550, 550)
self.CenterPane = CenterPanel(self)
self.setCentralWidget(self.CenterPane)
self.MenuToolBar = MenuToolBar(self)
def ShowOptions(self):
self.Options = OptionSettings(self)
if __name__ == '__main__':
MainApp = QApplication([])
MainGui = UI_MainWindow(MainApp.desktop())
MainGui.show()
sysExit(MainApp.exec_())
在 Win10 上使用 Python 3.7 和 pyqt5
我正在努力获得一个使用 QStandardItemModel 来显示超过 10 行的 QTreeView。我希望它显示该区域实际可以处理的最大行数,但由于某些未知原因(至少对我而言)它在 10 处停止。
我已经尝试了很多解决方案(一些我已经在下面的代码中注明了它们的明显结果)还有一些我没有包括在内,因为它们没有编译。到目前为止,我似乎无法找到一种方法来让 QTreeView 填充可用的 space and/or 显示所有行它可以只停在 10 行。我包括一个运行并显示问题的程序,只需单击 "Options",然后单击 "Option 1"
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Line(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
# Users Widget *************************************************
class Disply1(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.header = QVBoxLayout()
Title = QLabel()
Title.setStyleSheet('font: bold 14px')
Title.setText('Option 1 Configuration Settings')
self.header.addWidget(Title)
self.header.addWidget(Line(self))
# -------
self.TreeVew = QTreeView()
self.TreeVew.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.TreeVew.setAlternatingRowColors(True)
# This adjustment did not fix it
# self.TreeVew.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
# This adjustment made it worse
# self.TreeVew.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.model = QStandardItemModel(0, 6)
self.model.setHorizontalHeaderLabels([' ', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'])
self.model.setHeaderData(5, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
# This adjustment did not fix it
# self.model.setRowCount(20)
self.TreeVew.setModel(self.model)
self.TreeVew.setColumnWidth(0, 1)
self.TreeVew.setColumnHidden(0, True)
self.TreeVew.header().setSectionResizeMode(0, QHeaderView.Fixed)
self.TreeVew.header().setStretchLastSection(False)
self.TreeVew.header().setSectionResizeMode(1, QHeaderView.Stretch)
self.TreeVew.setColumnWidth(2, 100)
self.TreeVew.setColumnWidth(3, 100)
self.TreeVew.setColumnWidth(4, 100)
self.TreeVew.setColumnWidth(5, 70)
# This adjustment did not fix it
# self.TreeVew.resize(self.sizeHint().width(), self.maximumHeight())
ItmRecSet = [
{'Id':'01', 'Column1':'R01-C1', 'Column2':'R01-C2', 'Column3':'R01-C3', 'Column4':'R01-C5', 'Column5':'R01-C5'},
{'Id':'02', 'Column1':'R02-C1', 'Column2':'R02-C2', 'Column3':'R02-C3', 'Column4':'R02-C5', 'Column5':'R02-C5'},
{'Id':'03', 'Column1':'R03-C1', 'Column2':'R03-C2', 'Column3':'R03-C3', 'Column4':'R03-C5', 'Column5':'R03-C5'},
{'Id':'04', 'Column1':'R04-C1', 'Column2':'R04-C2', 'Column3':'R04-C3', 'Column4':'R04-C5', 'Column5':'R04-C5'},
{'Id':'05', 'Column1':'R05-C1', 'Column2':'R05-C2', 'Column3':'R05-C3', 'Column4':'R05-C5', 'Column5':'R05-C5'},
{'Id':'06', 'Column1':'R06-C1', 'Column2':'R06-C2', 'Column3':'R06-C3', 'Column4':'R06-C5', 'Column5':'R06-C5'},
{'Id':'07', 'Column1':'R07-C1', 'Column2':'R07-C2', 'Column3':'R07-C3', 'Column4':'R07-C5', 'Column5':'R07-C5'},
{'Id':'08', 'Column1':'R08-C1', 'Column2':'R08-C2', 'Column3':'R08-C3', 'Column4':'R08-C5', 'Column5':'R08-C5'},
{'Id':'09', 'Column1':'R09-C1', 'Column2':'R09-C2', 'Column3':'R09-C3', 'Column4':'R09-C5', 'Column5':'R09-C5'},
{'Id':'10', 'Column1':'R10-C1', 'Column2':'R10-C2', 'Column3':'R10-C3', 'Column4':'R10-C5', 'Column5':'R10-C5'},
{'Id':'11', 'Column1':'R11-C1', 'Column2':'R11-C2', 'Column3':'R11-C3', 'Column4':'R11-C5', 'Column5':'R11-C5'},
{'Id':'12', 'Column1':'R12-C1', 'Column2':'R12-C2', 'Column3':'R12-C3', 'Column4':'R12-C5', 'Column5':'R12-C5'},
{'Id':'13', 'Column1':'R13-C1', 'Column2':'R13-C2', 'Column3':'R13-C3', 'Column4':'R13-C5', 'Column5':'R13-C5'},
{'Id':'14', 'Column1':'R14-C1', 'Column2':'R14-C2', 'Column3':'R14-C3', 'Column4':'R14-C5', 'Column5':'R14-C5'},
{'Id':'15', 'Column1':'R15-C1', 'Column2':'R15-C2', 'Column3':'R15-C3', 'Column4':'R15-C5', 'Column5':'R15-C5'},
{'Id':'16', 'Column1':'R16-C1', 'Column2':'R16-C2', 'Column3':'R16-C3', 'Column4':'R16-C5', 'Column5':'R16-C5'},
{'Id':'17', 'Column1':'R17-C1', 'Column2':'R17-C2', 'Column3':'R17-C3', 'Column4':'R17-C5', 'Column5':'R17-C5'},
{'Id':'18', 'Column1':'R18-C1', 'Column2':'R18-C2', 'Column3':'R18-C3', 'Column4':'R18-C5', 'Column5':'R18-C5'},
{'Id':'19', 'Column1':'R19-C1', 'Column2':'R19-C2', 'Column3':'R19-C3', 'Column4':'R19-C5', 'Column5':'R19-C5'},
{'Id':'20', 'Column1':'R20-C1', 'Column2':'R20-C2', 'Column3':'R20-C3', 'Column4':'R20-C5', 'Column5':'R20-C5'}
]
self.model.setRowCount(0)
for Item in ItmRecSet:
Itm1 = QStandardItem(Item['Id'])
Itm1.setTextAlignment(Qt.AlignLeft)
Itm1.isEditable = False
Itm2 = QStandardItem(Item['Column1'])
Itm2.setTextAlignment(Qt.AlignLeft)
Itm2.isEditable = False
Itm3 = QStandardItem(Item['Column2'])
Itm3.setTextAlignment(Qt.AlignLeft)
Itm3.isEditable = False
Itm4 = QStandardItem(Item['Column3'])
Itm4.setTextAlignment(Qt.AlignLeft)
Itm4.isEditable = False
Itm5 = QStandardItem(Item['Column4'])
Itm5.setTextAlignment(Qt.AlignLeft)
Itm5.isEditable = False
Itm6 = QStandardItem(Item['Column5'])
Itm6.setTextAlignment(Qt.AlignCenter)
Itm6.isEditable = False
self.model.appendRow([Itm1, Itm2, Itm3, Itm4, Itm5, Itm6])
# Using this GridLayout versus the VerticalBox did not fix it
# self.Cntnr = QGridLayout()
# -------
# self.Cntnr.addLayout(self.header,0,0)
# self.Cntnr.addWidget(self.TreeVew,1,0)
# self.Cntnr.setRowStretch(2,4)
self.Cntnr = QVBoxLayout()
self.Cntnr.addLayout(self.header)
self.Cntnr.addWidget(self.TreeVew)
# If this stretch is not included only the header gets stretched the QTreeView still only shows 10 lines
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
# Debug Widget *************************************************
class Disply2(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.Cntnr = QVBoxLayout()
self.Cntnr.addWidget(QTextEdit('Option 2 Settings Shown Here'))
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
class OptionButtons(QToolButton):
# Class OptionButtons ("Text", Icon, Connector) inherits from QToolButton
def __init__(self, Text, Icon, Connector):
QToolButton.__init__(self)
self.setText(Text)
self.setIcon(Icon)
self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.setStyleSheet("font: bold;color: blue;height: 55px;width: 55px;")
self.setIconSize(QSize(32,32))
self.clicked.connect(Connector)
############################## Settings Class ##############################
class OptionSettings(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
line = QFrame()
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
# Button Area on Left
# Button 1 *************************************************
self.btnOptn1 = OptionButtons('Option1', QIcon('images/opt1.ico'), self.ShowDisply1)
# Button 2 *************************************************
self.btnOptn2 = OptionButtons('Option2', QIcon('images/opt2.ico'), self.ShowDisply2)
# Vertical Box for Buttons *************************************
self.UpLeft = QVBoxLayout()
self.UpLeft.addWidget(self.btnOptn1)
self.UpLeft.addWidget(self.btnOptn2)
self.UpLeft.addStretch(1)
# Display Area on Right
# Widget Flip Display ******************************************
self.UpRite = QHBoxLayout()
self.Contents = QStackedWidget()
self.Contents.addWidget(QTextEdit('Nothing Selected'))
self.Contents.addWidget(Disply1(self))
self.Contents.addWidget(Disply2(self))
self.Contents.addWidget(QTextEdit('Settings Saved'))
self.Contents.setCurrentIndex(0)
self.UpRite.addWidget(self.Contents)
# Button and Display Area on Top
self.Upper = QHBoxLayout()
self.Upper.addLayout(self.UpLeft)
self.Upper.addLayout(self.UpRite)
# Save and Cancel Area on Bottom
self.btnSave = QPushButton("Save")
self.btnSave.clicked.connect(self.SaveSettings)
self.btnCncl = QPushButton("Cancel")
self.btnCncl.clicked.connect(self.close)
self.Lower = QHBoxLayout()
self.Lower.addStretch(1)
self.Lower.addWidget(self.btnSave)
self.Lower.addWidget(self.btnCncl)
# Entire Options Window Layout
self.OuterBox = QVBoxLayout()
self.OuterBox.addLayout(self.Upper)
self.OuterBox.addLayout(self.Lower)
self.setLayout(self.OuterBox)
self.setWindowTitle('Settings')
#Geometry(Left, Top, Width, Hight)
self.setGeometry(250, 250, 550, 450)
self.setModal(True)
self.exec()
def ShowDisply1(self):
self.Contents.setCurrentIndex(1)
def ShowDisply2(self):
self.Contents.setCurrentIndex(2)
def SaveSettings(self):
self.Contents.setCurrentIndex(3)
class CustomItemModel(QStandardItemModel):
def headerData(self, section, orientation, role):
if role == Qt.ForegroundRole:
brush = QBrush()
brush.setColor(Qt.blue)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.BackgroundRole:
brush = QBrush()
brush.setColor(Qt.yellow)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.FontRole:
font = QFont()
font.setBold(True)
font.setPointSize(10)
return font
return super().headerData(section, orientation, role)
class ItemDsplyr(QTreeView):
def __init__(self, CentrPane):
QTreeView.__init__(self, CentrPane)
self.CntrPane = CentrPane
self.setEditTriggers(QTreeView().NoEditTriggers)
self.model = CustomItemModel(0, 3)
self.model.setHorizontalHeaderLabels(['1st Col', '2nd Col', '3rd Col'])
self.model.setHeaderData(1, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
self.setModel(self.model)
self.setMinimumWidth(250)
self.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.header().setStretchLastSection(False)
self.header().setSectionResizeMode(0, QHeaderView.Stretch)
self.setColumnWidth(1, 75)
self.setColumnWidth(2, 100)
class CenterPanel(QWidget):
def __init__(self, MainWin):
QWidget.__init__(self)
self.MyEditor = QTextEdit('Editorial')
self.ItemDsply = ItemDsplyr(self)
CntrPane = QSplitter(Qt.Horizontal, self)
CntrPane.addWidget(self.MyEditor)
CntrPane.addWidget(self.ItemDsply)
CntrPane.setSizes([50,200])
CntrPane.setCollapsible(0, False)
CntrPane.setCollapsible(1, False)
hbox = QHBoxLayout(self)
hbox.addWidget(CntrPane)
self.setLayout(hbox)
class MenuToolBar(QDockWidget):
def __init__(self, MainWin):
QDockWidget.__init__(self)
self.MainWin = MainWin
self.MainMenu = MainWin.menuBar()
self.WndowMenu = self.MainMenu.addMenu('Windows')
self.OptnAct = QAction('Options', self)
self.OptnAct.setStatusTip('Open the Options Window')
self.OptnAct.triggered.connect(MainWin.ShowOptions)
self.WndowMenu.addAction(self.OptnAct)
self.InitToolBar(MainWin)
def InitToolBar(self, MainWin):
self.mainToolBar = MainWin.addToolBar("Quick Access")
self.mainToolBar.addAction(self.OptnAct)
class UI_MainWindow(QMainWindow):
def __init__(self, MainDesktop):
super(UI_MainWindow, self).__init__(MainDesktop)
self.setWindowTitle('Main Window')
self.MnDskTop = MainDesktop
# Left, Top, Width, Height
self.setGeometry(200, 200, 550, 550)
self.CenterPane = CenterPanel(self)
self.setCentralWidget(self.CenterPane)
self.MenuToolBar = MenuToolBar(self)
def ShowOptions(self):
self.Options = OptionSettings(self)
if __name__ == '__main__':
MainApp = QApplication([])
MainGui = UI_MainWindow(MainApp.desktop())
MainGui.show()
sysExit(MainApp.exec_())
同样,我所期望的是 QTreeView 将填充可用的 space and/or 在给定的 space 中显示尽可能多的行。但是,如前所述,它会很快停止并且最多只显示 10 行。
我删除了行 self.Cntnr.addStretch(1)
,结果是这样的:
from sys import exit as sysExit
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Line(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.HLine)
self.setFrameShadow(QFrame.Sunken)
# Users Widget *************************************************
class Disply1(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.header = QVBoxLayout()
Title = QLabel()
Title.setStyleSheet('font: bold 14px')
Title.setText('Option 1 Configuration Settings')
self.header.addWidget(Title)
self.header.addWidget(Line(self))
# -------
self.TreeVew = QTreeView()
self.TreeVew.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.TreeVew.setAlternatingRowColors(True)
# This adjustment did not fix it
# self.TreeVew.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
# This adjustment made it worse
# self.TreeVew.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.model = QStandardItemModel(0, 6)
self.model.setHorizontalHeaderLabels([' ', 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'])
self.model.setHeaderData(5, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
# This adjustment did not fix it
# self.model.setRowCount(20)
self.TreeVew.setModel(self.model)
self.TreeVew.setColumnWidth(0, 1)
self.TreeVew.setColumnHidden(0, True)
self.TreeVew.header().setSectionResizeMode(0, QHeaderView.Fixed)
self.TreeVew.header().setStretchLastSection(False)
self.TreeVew.header().setSectionResizeMode(1, QHeaderView.Stretch)
self.TreeVew.setColumnWidth(2, 100)
self.TreeVew.setColumnWidth(3, 100)
self.TreeVew.setColumnWidth(4, 100)
self.TreeVew.setColumnWidth(5, 70)
# This adjustment did not fix it
# self.TreeVew.resize(self.sizeHint().width(), self.maximumHeight())
#@ self.TreeVew.resize(400, 600)
ItmRecSet = [
{'Id':'01', 'Column1':'R01-C1', 'Column2':'R01-C2', 'Column3':'R01-C3', 'Column4':'R01-C5', 'Column5':'R01-C5'},
{'Id':'02', 'Column1':'R02-C1', 'Column2':'R02-C2', 'Column3':'R02-C3', 'Column4':'R02-C5', 'Column5':'R02-C5'},
{'Id':'03', 'Column1':'R03-C1', 'Column2':'R03-C2', 'Column3':'R03-C3', 'Column4':'R03-C5', 'Column5':'R03-C5'},
{'Id':'04', 'Column1':'R04-C1', 'Column2':'R04-C2', 'Column3':'R04-C3', 'Column4':'R04-C5', 'Column5':'R04-C5'},
{'Id':'05', 'Column1':'R05-C1', 'Column2':'R05-C2', 'Column3':'R05-C3', 'Column4':'R05-C5', 'Column5':'R05-C5'},
{'Id':'06', 'Column1':'R06-C1', 'Column2':'R06-C2', 'Column3':'R06-C3', 'Column4':'R06-C5', 'Column5':'R06-C5'},
{'Id':'07', 'Column1':'R07-C1', 'Column2':'R07-C2', 'Column3':'R07-C3', 'Column4':'R07-C5', 'Column5':'R07-C5'},
{'Id':'08', 'Column1':'R08-C1', 'Column2':'R08-C2', 'Column3':'R08-C3', 'Column4':'R08-C5', 'Column5':'R08-C5'},
{'Id':'09', 'Column1':'R09-C1', 'Column2':'R09-C2', 'Column3':'R09-C3', 'Column4':'R09-C5', 'Column5':'R09-C5'},
{'Id':'10', 'Column1':'R10-C1', 'Column2':'R10-C2', 'Column3':'R10-C3', 'Column4':'R10-C5', 'Column5':'R10-C5'},
{'Id':'11', 'Column1':'R11-C1', 'Column2':'R11-C2', 'Column3':'R11-C3', 'Column4':'R11-C5', 'Column5':'R11-C5'},
{'Id':'12', 'Column1':'R12-C1', 'Column2':'R12-C2', 'Column3':'R12-C3', 'Column4':'R12-C5', 'Column5':'R12-C5'},
{'Id':'13', 'Column1':'R13-C1', 'Column2':'R13-C2', 'Column3':'R13-C3', 'Column4':'R13-C5', 'Column5':'R13-C5'},
{'Id':'14', 'Column1':'R14-C1', 'Column2':'R14-C2', 'Column3':'R14-C3', 'Column4':'R14-C5', 'Column5':'R14-C5'},
{'Id':'15', 'Column1':'R15-C1', 'Column2':'R15-C2', 'Column3':'R15-C3', 'Column4':'R15-C5', 'Column5':'R15-C5'},
{'Id':'16', 'Column1':'R16-C1', 'Column2':'R16-C2', 'Column3':'R16-C3', 'Column4':'R16-C5', 'Column5':'R16-C5'},
{'Id':'17', 'Column1':'R17-C1', 'Column2':'R17-C2', 'Column3':'R17-C3', 'Column4':'R17-C5', 'Column5':'R17-C5'},
{'Id':'18', 'Column1':'R18-C1', 'Column2':'R18-C2', 'Column3':'R18-C3', 'Column4':'R18-C5', 'Column5':'R18-C5'},
{'Id':'19', 'Column1':'R19-C1', 'Column2':'R19-C2', 'Column3':'R19-C3', 'Column4':'R19-C5', 'Column5':'R19-C5'},
{'Id':'20', 'Column1':'R20-C1', 'Column2':'R20-C2', 'Column3':'R20-C3', 'Column4':'R20-C5', 'Column5':'R20-C5'}
]
self.model.setRowCount(0)
for Item in ItmRecSet:
Itm1 = QStandardItem(Item['Id'])
Itm1.setTextAlignment(Qt.AlignLeft)
Itm1.isEditable = False
Itm2 = QStandardItem(Item['Column1'])
Itm2.setTextAlignment(Qt.AlignLeft)
Itm2.isEditable = False
Itm3 = QStandardItem(Item['Column2'])
Itm3.setTextAlignment(Qt.AlignLeft)
Itm3.isEditable = False
Itm4 = QStandardItem(Item['Column3'])
Itm4.setTextAlignment(Qt.AlignLeft)
Itm4.isEditable = False
Itm5 = QStandardItem(Item['Column4'])
Itm5.setTextAlignment(Qt.AlignLeft)
Itm5.isEditable = False
Itm6 = QStandardItem(Item['Column5'])
Itm6.setTextAlignment(Qt.AlignCenter)
Itm6.isEditable = False
self.model.appendRow([Itm1, Itm2, Itm3, Itm4, Itm5, Itm6])
# Using this GridLayout versus the VerticalBox did not fix it
# self.Cntnr = QGridLayout()
# -------
# self.Cntnr.addLayout(self.header,0,0)
# self.Cntnr.addWidget(self.TreeVew,1,0)
# self.Cntnr.setRowStretch(2,4)
self.Cntnr = QVBoxLayout()
self.Cntnr.addLayout(self.header)
self.Cntnr.addWidget(self.TreeVew)
# If this stretch is not included only the header gets stretched the QTreeView still only shows 10 lines
#--- self.Cntnr.addStretch(1) # <<<=======
# -------
self.setLayout(self.Cntnr)
# Debug Widget *************************************************
class Disply2(QFrame):
def __init__(self, parent):
QFrame.__init__(self)
self.setFrameShape(QFrame.StyledPanel)
self.setLineWidth(0.2)
# -------
self.Cntnr = QVBoxLayout()
self.Cntnr.addWidget(QTextEdit('Option 2 Settings Shown Here'))
self.Cntnr.addStretch(1)
# -------
self.setLayout(self.Cntnr)
class OptionButtons(QToolButton):
# Class OptionButtons ("Text", Icon, Connector) inherits from QToolButton
def __init__(self, Text, Icon, Connector):
QToolButton.__init__(self)
self.setText(Text)
self.setIcon(Icon)
self.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.setStyleSheet("font: bold;color: blue;height: 55px;width: 55px;")
self.setIconSize(QSize(32,32))
self.clicked.connect(Connector)
############################## Settings Class ##############################
class OptionSettings(QDialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
line = QFrame()
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
# Button Area on Left
# Button 1 *************************************************
self.btnOptn1 = OptionButtons('Option1', QIcon('Ok.png'), self.ShowDisply1)
# Button 2 *************************************************
self.btnOptn2 = OptionButtons('Option2', QIcon('images/opt2.ico'), self.ShowDisply2)
# Vertical Box for Buttons *************************************
self.UpLeft = QVBoxLayout()
self.UpLeft.addWidget(self.btnOptn1)
self.UpLeft.addWidget(self.btnOptn2)
self.UpLeft.addStretch(1)
# Display Area on Right
# Widget Flip Display ******************************************
self.UpRite = QHBoxLayout()
self.Contents = QStackedWidget()
self.Contents.addWidget(QTextEdit('Nothing Selected'))
self.Contents.addWidget(Disply1(self))
self.Contents.addWidget(Disply2(self))
self.Contents.addWidget(QTextEdit('Settings Saved'))
self.Contents.setCurrentIndex(0)
self.UpRite.addWidget(self.Contents)
# Button and Display Area on Top
self.Upper = QHBoxLayout()
self.Upper.addLayout(self.UpLeft)
self.Upper.addLayout(self.UpRite)
# Save and Cancel Area on Bottom
self.btnSave = QPushButton("Save")
self.btnSave.clicked.connect(self.SaveSettings)
self.btnCncl = QPushButton("Cancel")
self.btnCncl.clicked.connect(self.close)
self.Lower = QHBoxLayout()
self.Lower.addStretch(1)
self.Lower.addWidget(self.btnSave)
self.Lower.addWidget(self.btnCncl)
# Entire Options Window Layout
self.OuterBox = QVBoxLayout()
self.OuterBox.addLayout(self.Upper)
self.OuterBox.addLayout(self.Lower)
self.setLayout(self.OuterBox)
self.setWindowTitle('Settings')
#Geometry(Left, Top, Width, Hight)
self.setGeometry(250, 250, 550, 450)
self.setModal(True)
self.exec()
def ShowDisply1(self):
self.Contents.setCurrentIndex(1)
def ShowDisply2(self):
self.Contents.setCurrentIndex(2)
def SaveSettings(self):
self.Contents.setCurrentIndex(3)
class CustomItemModel(QStandardItemModel):
def headerData(self, section, orientation, role):
if role == Qt.ForegroundRole:
brush = QBrush()
brush.setColor(Qt.blue)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.BackgroundRole:
brush = QBrush()
brush.setColor(Qt.yellow)
brush.setStyle(Qt.SolidPattern)
return brush
elif role == Qt.FontRole:
font = QFont()
font.setBold(True)
font.setPointSize(10)
return font
return super().headerData(section, orientation, role)
class ItemDsplyr(QTreeView):
def __init__(self, CentrPane):
QTreeView.__init__(self, CentrPane)
self.CntrPane = CentrPane
self.setEditTriggers(QTreeView().NoEditTriggers)
self.model = CustomItemModel(0, 3)
self.model.setHorizontalHeaderLabels(['1st Col', '2nd Col', '3rd Col'])
self.model.setHeaderData(1, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole)
self.setModel(self.model)
self.setMinimumWidth(250)
self.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
self.header().setStretchLastSection(False)
self.header().setSectionResizeMode(0, QHeaderView.Stretch)
self.setColumnWidth(1, 75)
self.setColumnWidth(2, 100)
class CenterPanel(QWidget):
def __init__(self, MainWin):
QWidget.__init__(self)
self.MyEditor = QTextEdit('Editorial')
self.ItemDsply = ItemDsplyr(self)
CntrPane = QSplitter(Qt.Horizontal, self)
CntrPane.addWidget(self.MyEditor)
CntrPane.addWidget(self.ItemDsply)
CntrPane.setSizes([50,200])
CntrPane.setCollapsible(0, False)
CntrPane.setCollapsible(1, False)
hbox = QHBoxLayout(self)
hbox.addWidget(CntrPane)
self.setLayout(hbox)
class MenuToolBar(QDockWidget):
def __init__(self, MainWin):
QDockWidget.__init__(self)
self.MainWin = MainWin
self.MainMenu = MainWin.menuBar()
self.WndowMenu = self.MainMenu.addMenu('Windows')
self.OptnAct = QAction('Options', self)
self.OptnAct.setStatusTip('Open the Options Window')
self.OptnAct.triggered.connect(MainWin.ShowOptions)
self.WndowMenu.addAction(self.OptnAct)
self.InitToolBar(MainWin)
def InitToolBar(self, MainWin):
self.mainToolBar = MainWin.addToolBar("Quick Access")
self.mainToolBar.addAction(self.OptnAct)
class UI_MainWindow(QMainWindow):
def __init__(self, MainDesktop):
super(UI_MainWindow, self).__init__(MainDesktop)
self.setWindowTitle('Main Window')
self.MnDskTop = MainDesktop
# Left, Top, Width, Height
self.setGeometry(200, 200, 550, 550)
self.CenterPane = CenterPanel(self)
self.setCentralWidget(self.CenterPane)
self.MenuToolBar = MenuToolBar(self)
def ShowOptions(self):
self.Options = OptionSettings(self)
if __name__ == '__main__':
MainApp = QApplication([])
MainGui = UI_MainWindow(MainApp.desktop())
MainGui.show()
sysExit(MainApp.exec_())