qt-async-threads#

qt-async-threads allows Qt applications to run computational or IO intensive operations in threads using convenient async/await syntax.

class Window(QWidget):
    def __init__(self, runner: AbstractAsyncRunner) -> None:
        super().__init__()
        self.setWindowTitle("Cat Finder")
        self.runner = runner
        self.results_label = QLabel("Idle")
        self.results_label.setTextFormat(Qt.MarkdownText)
        self.results_label.setOpenExternalLinks(True)
        self.search_button = QPushButton("Search")

        layout = QVBoxLayout(self)
        layout.addWidget(self.results_label)
        layout.addWidget(self.search_button)

        self.search_button.clicked.connect(self.runner.to_sync(self._on_search_button_clicked))

    async def _on_search_button_clicked(self, *args: object) -> None:
        response = await self.runner.run(requests.get, "https://api.thecatapi.com/v1/images/search")
        url = response.json()[0]["url"]
        self.results_label.setText(f"Found a cat! [click to open]({url})")