Advertisement
Recompense

mrp pyqt

Apr 2nd, 2025 (edited)
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.26 KB | None | 0 0
  1. import sys
  2.  
  3. from PyQt6.QtCore import QAbstractTableModel, QModelIndex, Qt
  4. from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, QFrame, QLabel, QComboBox, \
  5.     QTableView, QHeaderView, QPushButton
  6.  
  7.  
  8. ######
  9.  
  10. class MainWindow(QMainWindow):
  11.  
  12.     def __init__(self):
  13.         super().__init__()
  14.  
  15.         """Set up main window definition - fixed width of 450, with an internal vertical layout.
  16.         In my real implementation, this is going to be the 'left side' of a QHBoxLayout but I haven't designed
  17.         the right side yet."""
  18.  
  19.         self.central_widget = QWidget()
  20.         self.setCentralWidget(self.central_widget)
  21.         self.layout = QHBoxLayout()
  22.         self.central_widget.setLayout(self.layout)
  23.         self.setFixedWidth(450)
  24.         self.sub_layout = QVBoxLayout()
  25.         self.layout.addLayout(self.sub_layout)
  26.         """populate vertical layout"""
  27.         self.top_section = TopSection()
  28.         self.sub_layout.addWidget(self.top_section)
  29.         """separator frame for visibility"""
  30.         sep = QFrame()
  31.         sep.setFrameShape(QFrame.Shape.HLine)
  32.         self.sub_layout.addWidget(sep)
  33.         self.bottom_section = BottomSection()
  34.         self.sub_layout.addWidget(self.bottom_section)
  35.  
  36.  
  37. class TopSection(QWidget):
  38.  
  39.     def __init__(self):
  40.         super().__init__()
  41.         self.layout = QHBoxLayout()
  42.         self.setLayout(self.layout)
  43.         """in the real application, this frame is replaced with nested layouts and widgets"""
  44.         example_frame = QFrame()
  45.         example_frame.setFrameShape(QFrame.Shape.Box)
  46.         example_frame.setFrameShadow(QFrame.Shadow.Plain)
  47.         example_frame.setFixedHeight(200)
  48.         example_frame.setFixedWidth(250)
  49.         self.layout.addWidget(example_frame)
  50.  
  51.  
  52. class BottomSection(QWidget):
  53.  
  54.     def __init__(self):
  55.         super().__init__()
  56.         self.layout = QVBoxLayout()
  57.         self.setLayout(self.layout)
  58.         """Set up the 4 widgets - in the real implementation they should be center aligned"""
  59.         """Label Header"""
  60.         label = QLabel("Lorem ipsum dolor sit amet...")
  61.         self.layout.addWidget(label)
  62.         """QComboBox for selecting main list item and simulating state changes"""
  63.         combo = QComboBox()
  64.         self.layout.addWidget(combo)
  65.         combo.addItem("Show 2 rows")
  66.         combo.addItem("Show 10 rows")
  67.         """QTableView for showing attributes of main list item"""
  68.         self.table = QTableView()
  69.         """hide headers for cleaner look"""
  70.         self.table.verticalHeader().setVisible(False)
  71.         self.table.horizontalHeader().setVisible(False)
  72.         self.table.setFixedWidth(250)
  73.         self.layout.addWidget(self.table)
  74.         table_model = MyTableModel()
  75.         self.table.setModel(table_model)
  76.         """QPushButton for parity with actual implementation layout"""
  77.         button = QPushButton("This does nothing")
  78.         self.layout.addWidget(button)
  79.  
  80.         """simulate initial state"""
  81.         self.make_rows(2)
  82.         self.resize_table()
  83.         """simulate state change driver"""
  84.         combo.currentIndexChanged.connect(self.simulate_state_change)
  85.  
  86.  
  87.     def make_rows(self, row_count: int):
  88.         self.table.model().clear()
  89.         for i in range(row_count):
  90.             self.table.model().insertRow(i)
  91.             self.table.model().setData(self.table.model().index(i, 0), i)
  92.             self.table.model().setData(self.table.model().index(i, 1), -i)
  93.             self.table.setRowHeight(i, 25)
  94.  
  95.     def resize_table(self):
  96.         """it appears these .columnWidth calls need to be redone after loading data"""
  97.         self.table.setColumnWidth(0, 40)
  98.         self.table.setColumnWidth(1, 210)
  99.         """cap the table height at 6 rows high, but let it be smaller than 6 rows high if needed"""
  100.         height = min(150, self.table.model().rowCount() * 25)
  101.         self.table.setFixedHeight(height)
  102.         self.table.update()
  103.  
  104.     def simulate_state_change(self):
  105.         self.make_rows(10 if self.table.model().rowCount() == 2 else 2)
  106.         self.resize_table()
  107.  
  108.  
  109. class MyTableModel(QAbstractTableModel):
  110.  
  111.     def __init__(self):
  112.         super().__init__()
  113.         self.records = []
  114.  
  115.     def rowCount(self, parent=QModelIndex()):
  116.         return len(self.records)
  117.  
  118.     def columnCount(self, parent=QModelIndex()):
  119.         return 2
  120.  
  121.     def insertRow(self, row, parent=QModelIndex()):
  122.         self.beginInsertRows(parent, row, row)
  123.         self.records.insert(row, [0, 0])
  124.         self.endInsertRows()
  125.  
  126.     def data(self, index, role=Qt.ItemDataRole.DisplayRole):
  127.         if not index.isValid():
  128.             return None
  129.         if role != Qt.ItemDataRole.DisplayRole:
  130.             return None
  131.         return self.records[index.row()][index.column()]
  132.  
  133.     def setData(self, index, value, role=Qt.ItemDataRole.EditRole):
  134.         if not index.isValid():
  135.             return False
  136.         if role == Qt.ItemDataRole.EditRole:
  137.             self.records[index.row()][index.column()] = value
  138.         self.dataChanged.emit(index, index, [role])
  139.  
  140.     def clear(self):
  141.         self.beginResetModel()
  142.         self.records = []
  143.         self.endResetModel() # emits modelReset()
  144.  
  145. #######
  146.  
  147. app = QApplication([])
  148. window = MainWindow()
  149.  
  150. window.show()
  151.  
  152. sys.exit(app.exec())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement