Oleg Klimenko
Oleg Klimenko

Reputation: 137

Problems with connect in pyqt5

I have a problem. I am writing a simple app in Pyqt5. I am trying to do this block of code in 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();

But when I am trying to use "connect" IDE tells me that "MainWindow" don't have method. How can I do it ?? Please help

This is my code:

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()

Upvotes: 1

Views: 2147

Answers (1)

code_dredd
code_dredd

Reputation: 6095

The connect method belongs to the signal that you wish to connect to a specific slot, not to the MainWindow widget itself. (BTW, you should consider inheriting from QMainWindow instead.)

In your code, the MainWindow widget is not a signal, so does not have a connect method. Also, even if it did, you need to specify the slot to which you're trying to connect the signal, which is also missing.

In other words, you must declare a pyqtSignal, if you're not using a pre-existing one, and then connect it to the pyqtSlot of your choice. Whether this slot is pre-defined or a custom one is up to you.

Consider the following code snippet, which I tested in 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_()

Notice that the button's clicked signal, not the button, is what gets connected to the dialog's close slot, not the dialog itself.


EDIT 1:

Just noticed that the very code you've posted has an example of how to properly perform a connection.

If your code has not simply been copy-pasted from some other place, you should've noticed that you seem to know how to properly connect signals and slots already. This line plainly gives it away:

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

If your MainWindow does have a btn_click method, then it should get invoked after the QPushButton named btn gets clicked.


EDIT 2:

Based on your recent comment, you seem to simply be trying to translate a snippet for a larger application, so consider the following code:

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)

The code above was tested to work as expected.

PS: I did notice that some seemingly valid URLs were returning an empty response (e.g. http://sourceforge.net/), but others, such as the one above, worked fine. It seems to be unrelated to the code snippet itself.

Upvotes: 3

Related Questions