# <center><i class="fa fa-edit"></i> Smart Dispenser: Understanding PyQt </center> ###### tags: `Internship` :::info **Goal:** - [x] Understanding PyQt Structure **Resources:** [PyQt](https://hackmd.io/Ibk_VuuWRXOjkION4wk3tg) [目前做到現在的程式](https://drive.google.com/drive/folders/1QNJJxxug1Njb9ATe-BdzcZKZZ1PGI2Sd?usp=sharing) ::: ### PyQt Text Editor ``` from PyQt6.QtWidgets import * from PyQt6.QtGui import QKeySequence, QAction class MainWindow(QMainWindow): def closeEvent(self, e): if not text.document().isModified(): return answer = QMessageBox.question( window, None, "You have unsaved changes. Save before closing?", QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel ) if answer & QMessageBox.Save: save() if text.document().isModified(): # This happens when the user closes the Save As... dialog. # We do not want to close the window in this case because it # would throw away unsaved changes. e.ignore() elif answer & QMessageBox.Cancel: e.ignore() app = QApplication([]) app.setApplicationName("Text Editor") text = QPlainTextEdit() window = MainWindow() window.setCentralWidget(text) file_path = None menu = window.menuBar().addMenu("&File") open_action = QAction("&Open") def open_file(): global file_path path = QFileDialog.getOpenFileName(window, "Open")[0] if path: text.setPlainText(open(path).read()) file_path = path open_action.triggered.connect(open_file) open_action.setShortcut(QKeySequence.StandardKey.Open) menu.addAction(open_action) save_action = QAction("&Save") def save(): if file_path is None: save_as() else: with open(file_path, "w") as f: f.write(text.toPlainText()) text.document().setModified(False) save_action.triggered.connect(save) save_action.setShortcut(QKeySequence.StandardKey.Save) menu.addAction(save_action) save_as_action = QAction("Save &As...") def save_as(): global file_path path = QFileDialog.getSaveFileName(window, "Save As")[0] if path: file_path = path save() save_as_action.triggered.connect(save_as) menu.addAction(save_as_action) close = QAction("&Close") close.triggered.connect(window.close) menu.addAction(close) help_menu = window.menuBar().addMenu("&Help") about_action = QAction("&About") help_menu.addAction(about_action) def show_about_dialog(): text = "<center>" \ "<h1>Text Editor</h1>" \ "&#8291;" \ "<img src=icon.svg>" \ "</center>" \ "<p>Version 31.4.159.265358<br/>" \ "Copyright &copy; Company Inc.</p>" QMessageBox.about(window, "About Text Editor", text) about_action.triggered.connect(show_about_dialog) window.show() app.exec() ``` ### PyQt QListView ``` from PyQt6.QtWidgets import * from PyQt6.QtCore import QStringListModel app = QApplication([]) model = QStringListModel([ "An element", "Another element", "Yay! Another one." ]) view = QListView() view.setModel(model) view.show() app.exec() ``` ### PyQT Tabel Model ``` from PyQt6.QtWidgets import * from PyQt6.QtCore import * headers = ["Scientist name", "Birthdate", "Contribution"] rows = [("Newton", "1643-01-04", "Classical mechanics"), ("Einstein", "1879-03-14", "Relativity"), ("Darwin", "1809-02-12", "Evolution")] class TableModel(QAbstractTableModel): def rowCount(self, parent): return len(rows) def columnCount(self, parent): return len(headers) def data(self, index, role): if role != Qt.ItemDataRole.DisplayRole: return QVariant() return rows[index.row()][index.column()] def headerData(self, section, orientation, role): if role != Qt.ItemDataRole.DisplayRole or orientation != Qt.Orientation.Horizontal: return QVariant() return headers[section] app = QApplication([]) model = TableModel() view = QTableView() view.setModel(model) view.show() app.exec() ```