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
方法,那么应该在名为 btn
的 QPushButton
获得 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/
),但其他一些,例如那个以上,工作正常。它似乎与代码片段本身无关。
我有问题。我正在用 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
方法,那么应该在名为 btn
的 QPushButton
获得 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/
),但其他一些,例如那个以上,工作正常。它似乎与代码片段本身无关。