קורס Advanced Python3 שיעור מבנה תוכנית Qt for Python


זה נושא דיון מלווה לערך המקורי ב- https://www.tocode.co.il/bundles/advanced-python3/lessons/pyqt-structure

שלום ינון,
בעקבות השיעור כתבתי קוד דומה מאוד למה שהוצג בסרטון והופיע לי באג מאוד מוזר
הקוד:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QBoxLayout(self)
        self.btn = QPushButton("Click me!!")
        self.label = QLabel("2+2 = 4")
        self.layout.addWidget(self.btn)
        self.layout.addWidget(self.label)

Q = QApplication(sys.argv)
w = MainWindow()
w.show()
w.exec_()

הבאג:
TypeError: QBoxLayout(QBoxLayout.Direction, parent: QWidget = None): argument 1 has unexpected type ‘MainWindow’
תודה מראש.

הי אדם,

זאת דרך אחת שעובדת כדי לכתוב את הקוד שרצית (בטח יש עוד כמה):

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        container = QWidget()
        self.setCentralWidget(container)

        self.layout = QHBoxLayout(container)
        self.btn = QPushButton("Click me!!")
        self.label = QLabel("2+2 = 4")
        self.layout.addWidget(self.btn)
        self.layout.addWidget(self.label)

app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

ולהסבר-

  1. הטעות הראשונה שלך היא השימוש ב QBoxLayout - יש לנו את QHboxLayout עבור תיבה אופקית ו QVBoxLayout עבור תיבה אנכית. צריך לבחור אחד מהשניים.

  2. הטעות השניה היא שימוש לא נכון ברכיב QMainWindow. רכיב זה הוא סוג של מעטפת שכולל די הרבה תתי-רכיבים (עבור התפריט, שורת הסטטוס וכו׳). אפשר לראות באיור את כל הרכיבים כאן:
    https://doc.qt.io/qt-5/qmainwindow.html#details
    לכן אי אפשר להגדיר Layout ל QMainWindow אלא רק לרכיב התוכן המרכזי שלו שנקרא centralWidget. מה שצריך זה להגדיר QWidget חדש, להדביק עליו את ה Layout ואת כל הפקדים ואז להגדיר את אותו QWidget חדש בתור ה centralWidget של החלון.

  3. טעות אחרונה היא שהפונקציה exec שייכת ל QApplication ולא ל QMainWindow.

מוזמן לקחת את הקוד שלי ולהמשיך ממנו, ובכל מקרה בשיעורים הבאים אני מראה בוידאו את ה GUI Designer וזה נותן דרך הרבה יותר קלה לבנות ממשקים.

נ.ב. - שים לב שהקוד שאני כותב נראה פה בפורום קצת יותר כמו קוד (עם צבעים ומיושר לשמאל). זה בגלל סימן מיוחד שמורכב משלושה סימני גרש הפוך לפני ואחרי בלוק הקוד. מוזמן ללחוץ ״עריכה״ על ההודעה שלך כדי לראות למה אני מתכוון וכדי שתוכל להשתמש בזה בפעמים הבאות שמדביק פה קוד.