как правильно произвести обработку нажатий клавиш мыши?
Что необходимо произвести обработку нажатий клавиш мыши с обновлением иконок в приложении.
Как должно работать:
- Запускается приложение, горит иконка 1, нажимаешь левой кнопкой мыши, срабатывает код для этой иконки.
- Нажимаешь правой, запускается выпадающий список, с похожими иконками, у каждой код одинаковый за исключением одного параметра.
- При нажатии левой кнопкой мыши на иконку выпадающего списка срабатывает код для нее, и иконка изначальная меняется на ту, которую применил.
Если нужно что-то уточнить, или кусок кода предоставить, пишите, отвечу. Буду очень благодарен за помощь.
Нашел почти то что мне нужно, но перевести на Pyqt5 не получается.
#
from PyQt4 import QtGui, Qt, QtCore
class Button(QtGui.QPushButton):
left_click = QtCore.pyqtSignal()
right_click = QtCore.pyqtSignal()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def mousePressEvent(self, event):
if event.button() == Qt.Qt.LeftButton:
self.left_click.emit()
elif event.button() == Qt.Qt.RightButton:
self.right_click.emit()
class Window(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
#super().__init__(parent, QtCore.Qt.Window)
vbox = QtGui.QVBoxLayout()
self.btn = Button('Нажми меня')
self.btn.left_click.connect(self.left_click)
self.btn.right_click.connect(self.right_click)
vbox.addWidget(self.btn)
self.setLayout(vbox)
def right_click(self):
print('right click')
def left_click(self):
print('left click')
app = QtGui.QApplication([])
window = Window()
window.show()
app.exec_()
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import sys
from PyQt5.Qt import *
class BaseButton(QPushButton):
def __init__(self, parent=None):
super(BaseButton, self).__init__(parent)
self.setText("Button")
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.window().setWindowIcon(QIcon('im.png'))
elif event.button() == Qt.RightButton:
self.window().list_widget.show()
def mouseReleaseEvent(self, event):
pass
class MyListWidget(QListWidget):
def __init__(self):
super().__init__()
self.setViewMode(QListView.IconMode)
self.setIconSize(QSize(100, 100))
self.setSpacing(5)
self.setEditTriggers(self.NoEditTriggers)
self.setDefaultDropAction(Qt.IgnoreAction)
self.setSelectionMode(self.ContiguousSelection)
self.setFlow(self.LeftToRight)
self.setWrapping(True)
self.setResizeMode(self.Adjust)
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('myapp')
self.setWindowIcon(QIcon('img/qt-logo.png'))
QToolTip.setFont(QFont("Times", 10, QFont.Bold))
self.list_widget = MyListWidget()
self.list_icon = ["lena.jpg", "Ok.png", "katya.jpg", 'img/qt-logo.png', 'im.png',
"lena.jpg", "Ok.png", "katya.jpg", 'img/qt-logo.png', 'im.png']
for i in range(10):
item = QListWidgetItem()
item.setText(f'item {i}')
icon = QIcon()
icon.addPixmap(QPixmap(self.list_icon[i]).scaled(100, 100),
QIcon.Normal, QIcon.Off)
item.setIcon(icon)
self.list_widget.addItem(item)
self.list_widget.currentRowChanged.connect(self.item_Pressed)
self.btn = BaseButton(self) #QPushButton("Physics", self)
layout = QVBoxLayout(self)
layout.addWidget(self.list_widget)
layout.addWidget(self.btn, alignment=Qt.AlignRight | Qt.AlignBottom)
self.list_widget.hide()
def item_Pressed(self, currentRow):
self.setWindowIcon(QIcon(self.list_icon[int(currentRow)]))
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWidget()
w.resize(500, 400)
w.show()
sys.exit(app.exec_())
Автор решения: biomotor
→ Ссылка
Поправил под PyQt5: все огонь!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtWidgets, QtGui, Qt
from PyQt5.QtWidgets import QPushButton, QVBoxLayout
class Button(QtWidgets.QPushButton):
left_click = QtCore.pyqtSignal()
right_click = QtCore.pyqtSignal()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def mousePressEvent(self, event):
if event.button() == Qt.Qt.LeftButton:
self.left_click.emit()
elif event.button() == Qt.Qt.RightButton:
self.right_click.emit()
class Window(QtWidgets.QWidget):
def __init__(self, parent=None):
QtWidgets.QWidget.__init__(self, parent)
#super().__init__(parent, QtCore.Qt.Window)
vbox = QtWidgets.QVBoxLayout()
self.btn = Button('Нажми меня')
self.btn.left_click.connect(self.left_click)
self.btn.right_click.connect(self.right_click)
vbox.addWidget(self.btn)
self.setLayout(vbox)
def right_click(self):
print('right click')
def left_click(self):
print('left click')
app = QtWidgets.QApplication([])
window = Window()
window.show()
app.exec_()
