यह कोड 3 अलग-अलग विंडो खोलता है:

1) main window
2) widgetA 
3) widgetB.

कोड को इस तरह कैसे लिखें कि वह 2 और 3 को 1 में ले जाए?

तो हमारे पास सिर्फ एक मुख्य विंडो है और इसमें 2 विजेट हैं जो एक दूसरे के साथ संवाद कर सकते हैं। साथ ही, एक अतिरिक्त विशेषता: हम किसी फ़ंक्शन को इस तरह से कैसे लिख सकते हैं कि वह आने वाले डेटा को सुनता है और फिर उसे भेज देता है?

class mainwindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(mainwindow, self).__init__(parent)

        self.button = QtWidgets.QPushButton("Click Me", self)
        self.button.clicked.connect(self.on_button_clicked)

        self.setCentralWidget(self.button)

        self.widgetA = widgetA()
        self.widgetB = widgetB()

        self.widgetA.procStart.connect(self.widgetB.on_procStart)
        self.widgetB.procDone.connect(self.widgetA.on_widgetB_procDone)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.widgetA.show()
        self.widgetB.show()

        self.widgetA.raise_()

class widgetA(QtWidgets.QWidget):
    procStart = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(widgetA, self).__init__(parent)

        self.lineEdit = QtWidgets.QLineEdit(self)
        self.lineEdit.setText("Hello!")

        self.button = QtWidgets.QPushButton("Send Message to B", self)
        self.button.clicked.connect(self.on_button_clicked)

        self.layout = QtWidgets.QHBoxLayout(self)
        self.layout.addWidget(self.lineEdit)
        self.layout.addWidget(self.button)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.procStart.emit(self.lineEdit.text())

    @QtCore.pyqtSlot(str)
    def on_widgetB_procDone(self, message):
        self.lineEdit.setText("From B: " + message)

        self.raise_()


class widgetB(QtWidgets.QWidget):

    procDone = QtCore.pyqtSignal(str)

    def __init__(self, parent=None):
        super(widgetB, self).__init__(parent)

        self.lineEdit = QtWidgets.QLineEdit(self)
        self.button = QtWidgets.QPushButton("Send Message to A", self)
        self.layout = QtWidgets.QHBoxLayout(self)
        self.layout.addWidget(self.lineEdit)
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.on_button_clicked)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.procDone.emit(self.lineEdit.text())

    @QtCore.pyqtSlot(str)
    def on_procStart(self, message):
        self.lineEdit.setText("From A: " + message)

        self.raise_()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    main = mainwindow()
    main.show()
    sys.exit(app.exec_())
0
wecandothis 25 अक्टूबर 2020, 19:31

1 उत्तर

सबसे बढ़िया उत्तर

यदि आपको "शीर्ष स्तरीय विंडो" में एक से अधिक विजेट दिखाने की आवश्यकता है (चाहे वह QWidget, QDialog या QMainWindow ही क्यों न हो) तो आपको एक कंटेनर विजेट बनाना होगा।

आपके मामले में आप QMainWindow का उपयोग कर रहे हैं, जो एक बहुत विशेष प्रकार का QWidget है, क्योंकि इसका अपना (आंतरिक और लगभग अप्राप्य) लेआउट है। मुख्य सामग्री जो आम तौर पर QMainWindow (इसके मेनूबार, स्टेटसबार, टूलबार और डॉकबार के अलावा) में दिखाई जाती है, "सेंट्रल विजेट" कहलाती है, और आप इसे QPushButton पर सेट कर रहे हैं, इसलिए कोई कमरा नहीं है। किसी और चीज के लिए।

सबसे आम और पारंपरिक तरीका एक नया QWidget बनाना है (जो एक खाली विजेट है जिसे सभी Qt विजेट के लिए आधार के रूप में उपयोग किया जाता है), इसके लिए एक लेआउट सेट करें और इसमें वास्तविक विजेट जोड़ें:

class mainwindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(mainwindow, self).__init__(parent)

        container = QtWidgets.QWidget()
        self.setCentralWidget(container)
        # using a widget as an argument in a Qt layout constructor results in 
        # automatically setting the layout for that widget
        layout = QtWidgets.QVBoxLayout(container)

        self.button = QtWidgets.QPushButton("Click Me", self)
        self.button.clicked.connect(self.on_button_clicked)

        self.widgetA = widgetA()
        self.widgetB = widgetB()

        layout.addWidget(self.button)
        layout.addWidget(self.widgetA)
        layout.addWidget(self.widgetB)
        # ...

ध्यान दें कि यदि आप QMainWindow का उपयोग नहीं कर रहे हैं, लेकिन एक मानक QWidget या QDialog, तो आपको स्पष्ट रूप से "केंद्रीय विजेट" का उपयोग करने की आवश्यकता नहीं है, और आप वर्तमान उदाहरण (self) पर एक नया लेआउट बना सकते हैं।

class SomeWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QtWidgets.QVBoxLayout(self)
        # ...
1
musicamante 26 अक्टूबर 2020, 00:31