【问题标题】:How to make a QTreeView display more than 10 lines如何使 QTreeView 显示超过 10 行
【发布时间】:2019-11-06 10:18:51
【问题描述】:

在 Win10 上使用 Python 3.7 和 pyqt5

我正在努力获得一个使用 QStandardItemModel 来显示超过 10 行的 QTreeView。我希望它显示该区域实际可以处理的最大行数,但由于某些未知(至少我是这样)原因,它在 10 处停止。

我已经尝试了许多解决方案(其中一些我已经在下面的代码中加上它们的明显结果进行了注释),还有一些我没有包括在内,因为它们没有编译。到目前为止,我似乎无法找到一种方法来让 QTreeView 填充可用空间和/或显示它可以在 10 行处停止的所有行。我包含一个运行并显示问题的程序,只需单击“选项”,然后单击“选项 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 将填充可用空间和/或在给定空间内显示尽可能多的行。但是,如前所述,它会停止,最多只显示 10 行。

【问题讨论】:

    标签: python pyqt pyqt5 python-3.7 qtreeview


    【解决方案1】:

    我删除了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_())
    

    【讨论】:

    • 好吧,这很奇怪,因为当我将那行注释掉时,我运行的前几个测试是拉伸标题行,但仍然只显示 10 行,但它现在可以工作了,也许我调整了其他东西不知不觉中。还是谢谢你看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多