Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from PyQt6.QtCore import QAbstractTableModel, QModelIndex, Qt
- from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QFrame, QLabel, QComboBox, \
- QTableView, QHeaderView, QPushButton
- ######
- class MainWindow(QMainWindow):
- def __init__(self):
- super().__init__()
- """Set up main window definition - fixed width of 450, with an internal vertical layout.
- In my real implementation, this is going to be the 'left side' of a QHBoxLayout but I haven't designed
- the right side yet."""
- self.central_widget = QWidget()
- self.setCentralWidget(self.central_widget)
- self.layout = QHBoxLayout()
- self.central_widget.setLayout(self.layout)
- self.setFixedWidth(450)
- self.sub_layout = QVBoxLayout()
- self.layout.addLayout(self.sub_layout)
- """populate vertical layout"""
- self.top_section = TopSection()
- self.sub_layout.addWidget(self.top_section)
- """separator frame for visibility"""
- sep = QFrame()
- sep.setFrameShape(QFrame.Shape.HLine)
- self.sub_layout.addWidget(sep)
- self.bottom_section = BottomSection()
- self.sub_layout.addWidget(self.bottom_section)
- class TopSection(QWidget):
- def __init__(self):
- super().__init__()
- self.layout = QHBoxLayout()
- self.setLayout(self.layout)
- """in the real application, this frame is replaced with nested layouts and widgets"""
- example_frame = QFrame()
- example_frame.setFrameShape(QFrame.Shape.Box)
- example_frame.setFrameShadow(QFrame.Shadow.Plain)
- example_frame.setFixedHeight(200)
- example_frame.setFixedWidth(250)
- self.layout.addWidget(example_frame)
- class BottomSection(QWidget):
- def __init__(self):
- super().__init__()
- self.layout = QVBoxLayout()
- self.setLayout(self.layout)
- """Set up the 4 widgets - in the real implementation they should be center aligned"""
- """Label Header"""
- label = QLabel("Lorem ipsum dolor sit amet...")
- self.layout.addWidget(label)
- """QComboBox for selecting main list item and simulating state changes"""
- combo = QComboBox()
- self.layout.addWidget(combo)
- combo.addItem("Show 2 rows")
- combo.addItem("Show 10 rows")
- """QTableView for showing attributes of main list item"""
- self.table = QTableView()
- """hide headers for cleaner look"""
- self.table.verticalHeader().setVisible(False)
- self.table.horizontalHeader().setVisible(False)
- self.table.setFixedWidth(250)
- self.layout.addWidget(self.table)
- table_model = MyTableModel()
- self.table.setModel(table_model)
- """QPushButton for parity with actual implementation layout"""
- button = QPushButton("This does nothing")
- self.layout.addWidget(button)
- """simulate initial state"""
- self.make_rows(2)
- self.resize_table()
- """simulate state change driver"""
- combo.currentIndexChanged.connect(self.simulate_state_change)
- def make_rows(self, row_count: int):
- self.table.model().clear()
- for i in range(row_count):
- self.table.model().insertRow(i)
- self.table.model().setData(self.table.model().index(i, 0), i)
- self.table.model().setData(self.table.model().index(i, 1), -i)
- self.table.setRowHeight(i, 25)
- def resize_table(self):
- """it appears these .columnWidth calls need to be redone after loading data"""
- self.table.setColumnWidth(0, 40)
- self.table.setColumnWidth(1, 210)
- """cap the table height at 6 rows high, but let it be smaller than 6 rows high if needed"""
- height = min(150, self.table.model().rowCount() * 25)
- self.table.setFixedHeight(height)
- self.table.update()
- def simulate_state_change(self):
- self.make_rows(10 if self.table.model().rowCount() == 2 else 2)
- self.resize_table()
- class MyTableModel(QAbstractTableModel):
- def __init__(self):
- super().__init__()
- self.records = []
- def rowCount(self, parent=QModelIndex()):
- return len(self.records)
- def columnCount(self, parent=QModelIndex()):
- return 2
- def insertRow(self, row, parent=QModelIndex()):
- self.beginInsertRows(parent, row, row)
- self.records.insert(row, [0, 0])
- self.endInsertRows()
- def data(self, index, role=Qt.ItemDataRole.DisplayRole):
- if not index.isValid():
- return None
- if role != Qt.ItemDataRole.DisplayRole:
- return None
- return self.records[index.row()][index.column()]
- def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
- if not index.isValid():
- return False
- if role == Qt.ItemDataRole.EditRole:
- self.records[index.row()][index.column()] = value
- self.dataChanged.emit(index, index, [role])
- def clear(self):
- self.beginResetModel()
- self.records = []
- self.endResetModel() # emits modelReset()
- #######
- app = QApplication([])
- window = MainWindow()
- window.show()
- sys.exit(app.exec())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement