pyqt5中的连接问题

时间:2015-10-20 12:12:36

标签: python python-3.4 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()

1 个答案:

答案 0 :(得分:3)

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

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

换句话说,如果您没有使用预先存在的pyqtSignal,则必须声明connect,然后将pyqtSlot声明为您选择的#!/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_() 。此插槽是预定义的还是自定义插槽由您决定。

考虑以下代码片段,我在Python3中测试过:

clicked

请注意,按钮的connect信号而非按钮是close对话框的self.btn.clicked.connect(self.btn_click) 插槽,而不是对话框本身。

编辑1:

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

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

MainWindow

如果您的btn_click确实有QPushButton方法,则应在名为btn的{​​{1}}获取clicked之后调用该方法。

编辑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://stackoverflow.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:我确实注意到一些看似有效的网址返回空响应(例如http://sourceforge.net/),但其他网址(例如上面的网址)工作正常。它似乎与代码片段无关。