Saya mencoba mengirim sinyal dan menerimanya di antara dua jendela, saya mengikuti persis dokumentasi.

Saat menjalankan program: Tidak ada kesalahan Atau menerima sinyal di slot

Saat Debugging di @pycharm: saya menerima kesalahan di bawah ini:

TypeError: connect() failed between started() and _signal()

Dua file Kode di bawah ini:

Nama file pertama: Signals.py

import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
import slots

class aaa(qtw.QWidget,qtc.QObject):
    submitted = qtc.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.setLayout(qtw.QVBoxLayout())
        self.edit = qtw.QLineEdit()
        self.submit=qtw.QPushButton('Submit',clicked=self.onSubmit)
        self.layout().addWidget(self.edit)
        self.layout().addWidget(self.submit)
        self.show()

    def onSubmit(self):
        self.submitted.emit(self.edit.text())
        self.close()
        self.myDialog2 = slots.bbb()


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    mw = aaa()
    sys.exit(app.exec())

Nama file kedua: slots.py

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
import Signals

class bbb(qtw.QWidget,qtc.QThread):

    @qtc.pyqtSlot()
    def __init__(self):
        super().__init__()

        self.setLayout(qtw.QVBoxLayout())
        self.label = qtw.QLabel(self)


        self.x=Signals.aaa()
        self.x.submitted.connect(self.label.setText)
        print(self.label.text())

        self.layout().addWidget(self.label)
        self.show()
0
Rhasta Shaman 5 Juli 2020, 01:55

1 menjawab

Jawaban Terbaik

Saya tidak tahu dokumentasi apa yang mengacu pada OP sehingga saya tidak dapat menunjukkan apakah tutorial yang Anda ikuti benar atau tidak. Jika Anda mengacu pada dokumen resmi maka Anda jelas tidak mengikutinya dengan benar.

Kode Anda memiliki banyak kesalahan, jadi saya hanya akan menyebutkan yang paling penting:

  • Koneksi harus digunakan sebelum memancarkan sinyal,

  • Anda tidak boleh mewarisi dari QObject dan QWidget karena mereka akan memiliki konflik, selain itu tidak ada pembenaran.

  • Anda seharusnya tidak menggunakan pyqtSlot secara tidak perlu, mengaturnya di konstruktor tidak masuk akal.

  • Anda membuat impor melingkar.

  • "self.x" bukan "mw" tapi objek lain.

Solusi yang mungkin adalah sebagai berikut:

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc


class bbb(qtw.QWidget):
    def __init__(self):
        super().__init__()

        lay = qtw.QVBoxLayout(self)
        self.label = qtw.QLabel()
        lay.addWidget(self.label)
import sys
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
import slots


class aaa(qtw.QWidget, qtc.QObject):
    submitted = qtc.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.edit = qtw.QLineEdit()
        self.submit = qtw.QPushButton("Submit", clicked=self.onSubmit)
        lay = qtw.QVBoxLayout(self)
        lay.addWidget(self.edit)
        lay.addWidget(self.submit)
        
        self.myDialog2 = slots.bbb()
        self.submitted.connect(self.myDialog2.label.setText)

    def onSubmit(self):
        self.submitted.emit(self.edit.text())
        self.close()

        self.myDialog2.show()


if __name__ == "__main__":
    app = qtw.QApplication(sys.argv)
    mw = aaa()
    mw.show()
    sys.exit(app.exec())
0
eyllanesc 4 Juli 2020, 23:41