import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget
from PyQt5.QtCore import QSize
class ExampleWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setMinimumSize(QSize(320, 240))
self.setWindowTitle('Example')
central_widget = QWidget(self)
grid_layout = QGridLayout(central_widget)
self.setCentralWidget(central_widget)
self._label = QLabel('', self)
self._label.setAlignment(QtCore.Qt.AlignCenter)
grid_layout.addWidget(self._label, 0, 0)
self._counter = 0
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Q:
self._counter += 1
self._label.setText('Клавиша Q нажата {} раз'.format(self._counter))
event.accept()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = ExampleWindow()
main_window.show()
sys.exit(app.exec_())
app.exec()
Его нельзя останавливать, иначе приложение зависнет. Но eventloop - это тоже бесконечный цикл, который запускается, когда вы вызываете asyncio.run()
. В результате цикл событий asyncio останавливает цикл событий Qt. Выхода может быть два: либо с помощью Quamash использовать один цикл и для asyncio и для Qt, либо запускать цикл asyncio в отдельном потоке (лучше QThread). import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QDrag, QPixmap, QImage, QPainter, QCursor
from PyQt5.QtCore import QMimeData, Qt
class DraggableLabel(QLabel):
def __init__(self, parent, image):
super(QLabel, self).__init__(parent)
self.setPixmap(QPixmap(image).scaledToWidth(64))
self.show()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.drag_start_position = event.pos()
def mouseMoveEvent(self, event):
if not (event.buttons() & Qt.LeftButton):
return
if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
return
drag = QDrag(self)
mimedata = QMimeData()
mimedata.setText(self.text())
mimedata.setImageData(self.pixmap().toImage())
drag.setMimeData(mimedata)
pixmap = QPixmap(self.size())
painter = QPainter(pixmap)
painter.drawPixmap(self.rect(), self.grab())
painter.end()
drag.setPixmap(pixmap)
drag.setHotSpot(event.pos())
drag.exec_(Qt.CopyAction | Qt.MoveAction)
class DropLabel(QLabel):
def __init__(self, *args, **kwargs):
QLabel.__init__(self, *args, **kwargs)
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
if event.mimeData().hasImage():
print('event accepted')
event.accept()
else:
print('event rejected')
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasImage():
self.setPixmap(QPixmap.fromImage(QImage(event.mimeData().imageData())))
class Widget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label = DropLabel('drop there', self)
label.setGeometry(190, 65, 100, 100)
label_to_drag = DraggableLabel(self, 'image.png')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())