pyqt5中的连接问题

Problems with connect in pyqt5

我有问题。我正在用 Pyqt5 编写一个简单的应用程序。我正在尝试在 PyQt 中执行此代码块:

QNetworkAccessManager manager;
QNetworkReply *response = manager.get(QNetworkRequest(QUrl(url)));
QEventLoop event;
connect(response,SIGNAL(finished()),&event,SLOT(quit()));
event.exec();
QString html = response->readAll();

但是当我尝试使用 "connect" 时,IDE 告诉我 "MainWindow" 没有方法。我该怎么做 ??请帮助

这是我的代码:

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super(MainWindow, self).__init__()

        # window settings
        self.setWindowTitle("Hello world app")

        # main layout
        self.lay = QtWidgets.QVBoxLayout()

        # main widgets
        self.label = QtWidgets.QLabel("Enter URL:")
        self.line = QtWidgets.QLineEdit()
        self.label_conn = QtWidgets.QLabel("")
        self.btn = QtWidgets.QPushButton("Connect")
        self.btn.clicked.connect(self.btn_click)

        # adding widgets to layout
        self.lay.addWidget(self.label, alignment=QtCore.Qt.AlignBottom)
        self.lay.addWidget(self.line)
        self.lay.addWidget(self.btn)
        self.lay.addWidget(self.label_conn, alignment=QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)
        self.setLayout(self.lay)

        self.connect()

connect 方法属于您希望连接到特定 插槽 信号,而不属于 MainWindow 小部件本身。 (顺便说一句,您应该考虑从 QMainWindow 继承。)

在您的代码中,MainWindow 小部件不是信号,因此没有 connect 方法。此外,即使是这样,您也需要指定您尝试连接信号的插槽,这也是缺失的。

换句话说,如果您不使用已有的 pyqtSignal,则必须声明 pyqtSignal,然后 connect 将其声明为您选择的 pyqtSlot。此广告位是预定义的还是自定义的,由您决定。

考虑以下代码片段,我在 Python3 中对其进行了测试:

#!/usr/bin/python3 -B

import sys
from PyQt5.QtWidgets import QApplication, QDialog, QPushButton

if __name__ == '__main__':
    app  = QApplication(sys.argv)

    diag = QDialog()
    diag.setWindowTitle('Signal Demo')
    diag.resize(200,50)

    btn  = QPushButton(diag)
    btn.setText('Close Dialog')

    # connect button's clicked signal to dialog's close slot
    btn.clicked.connect(diag.close)

    diag.show()
    diag.exec_()

请注意按钮的 clicked 信号,而不是按钮,是 connect 到对话框的 close 插槽的信号,而不是对话框本身。


编辑 1:

刚注意到您发布的代码中有一个如何正确执行连接的示例。

如果您的代码不是简单地从其他地方复制粘贴的,您应该已经注意到您似乎已经知道如何正确连接信号和槽。这条线很明显地暴露了它:

self.btn.clicked.connect(self.btn_click)

如果您的 MainWindow 确实有一个 btn_click 方法,那么应该在名为 btnQPushButton 获得 clicked.[=30 之后调用它=]


编辑 2:

根据您最近的评论,您似乎只是想为更大的应用程序翻译一个片段,因此请考虑以下代码:

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtCore import QEventLoop, QUrl

app = QApplication(sys.argv)
url = 'https://whosebug.com'
manager = QNetworkAccessManager()
response = manager.get(QNetworkRequest(QUrl(url)))
event = QEventLoop()
response.finished.connect(event.quit)
event.exec()
html = str(response.readAll())   # in Python3 all strings are unicode, so QString is not defined
print(html)

上面的代码已经过测试,可以按预期工作。

PS: 我确实注意到一些看似有效的 URL 返回了一个空响应(例如 http://sourceforge.net/),但其他一些,例如那个以上,工作正常。它似乎与代码片段本身无关。