我有问题。我正在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()
答案 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)
插槽,而不是对话框本身。
注意到您发布的代码中有一个如何正确执行连接的示例。
如果您的代码不是简单地从其他地方复制粘贴,您应该已经注意到您似乎已经知道如何正确连接信号和插槽。这条线明确地说明了它:
MainWindow
如果您的btn_click
确实有QPushButton
方法,则应在名为btn
的{{1}}获取clicked
之后调用该方法。
根据您最近的评论,您似乎只是尝试为更大的应用程序翻译代码段,因此请考虑以下代码:
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/
),但其他网址(例如上面的网址)工作正常。它似乎与代码片段无关。