Найти - Пользователи
Полная версия: QFrame. Привязать сигнал
Начало » GUI » QFrame. Привязать сигнал
1 2 3
MetalHead
Всем добрый вечер, писал несложный скрипт столкнулся с небольшой проблемой. При клике по обычной кнопке достаточно написать:
button.clicked.connect(action)
А вот для виджета QFrame что-то не могу найти. Перерыл много англоязычных сайтов. Нужно чтобы фрейм отзывался на клик мыши. Спасибо.
vrabey
можно наследовать QFrame и в самом классе переопределить метод -
mousePressEvent
но если задача стоит - кликнуть только на рамке то не получается - метод срабатывает и внутри рамки

MetalHead
Спасибо, замучился, наследовал, переопределил, но говорит нету у QFrame такого метода. Как быть?
import sys
from PyQt4 import QtGui, QtCore
class Frame(QtGui.QFrame):
    signal = QtCore.pyqtSignal()
    def __init__(self):
        super(Frame, self).__init__()
    def indicators(self):
        self.p = 0
        i = 48
        self.indicator = []
        
        
        while self.p != 8:
            self.indicator.append(QtGui.QFrame(self))
            self.indicator[self.p].setFixedSize(17, 17)
            self.indicator[self.p].setStyleSheet("QWidget {background: #666;}")
            self.indicator[self.p].move(i, 60)
            self.indicator[self.p].signal.connect(self.click_on)
            
            self.p += 1
            i += 25
    def mousePressEvent(self, event):
        self.signal.emit()        
    def click_on(self):
        self.indicator[1].setStyleSheet("QWidget {background: #ccc;}")
class Base(QtGui.QWidget):
    def __init__(self):
        super(Base, self).__init__()
        self.startUW()
    def startUW(self):
        
        self.fields()
        record = QtGui.QPushButton("Записать", self)
        record.move(100, 18)
        play = QtGui.QPushButton("Проиграть", self)
        play.move(190, 18)
        Frame.indicators(self)
        self.setWindowTitle("Indicator Generator v0.1")
        self.setFixedSize(300, 250)
        self.move(300, 250)
        self.show()
    def fields(self):
        p = 0
        i = 10
        self.field = []
        while p != 2:
            self.field.append(QtGui.QLineEdit(self))
            self.field[p].setFixedSize(40, 25)
            self.field[p].move(i, 20)
            p += 1
  
def main():
    app = QtGui.QApplication(sys.argv)
    gui = Base()
    sys.exit(app.exec())
if __name__ == "__main__":
    main()
vrabey
MetalHead
а мог бы ты словами объяснить чего хочешь, что должен фрейм делать, и какие ошибки получаешь
в твоём коде есть опечатки
у меня в таком виде он вообще не запускается

что бы кликнуть по виджету его надо отобразить а где у тебя фрейм отображается?
MetalHead
vrabey
MetalHeadа мог бы ты словами объяснить чего хочешь, что должен фрейм делать, и какие ошибки получаешьв твоём коде есть опечаткиу меня в таком виде он вообще не запускаетсячто бы кликнуть по виджету его надо отобразить а где у тебя фрейм отображается?
Мне нужно, чтобы фрейм реагировал на клик, меняя свой цвет. Да знаю, что есть ошибка. Как мне наследовать QFrame, что-то плохо у меня с ООП, простите.
vrabey
MetalHead
Мне нужно, чтобы фрейм реагировал на клик, меняя свой цвет
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class Frame(QtGui.QFrame):
    def __init__(self, parent=None):
        QtGui.QFrame.__init__(self, parent)
        self.setFrameShape(QtGui.QFrame.Box)
        self.setLineWidth(5)
        self.setStyleSheet('color: {0};'.format('#000000'))
    def mousePressEvent(self, event, color=None):
        if color is None:
            color = 'green'
        self.setStyleSheet('color: {0};'.format(color))
class BaseWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(300, 200)
        self.frame = Frame(self)
        self.frame.setFixedSize(150, 150)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = BaseWindow()
    main.show()
    sys.exit(app.exec_())
MetalHead
Вот за это большущее спасибо.
MetalHead
Еще одно такое пожелание, как сделать так чтобы при повторном нажатии на фрейм он возвращался к исходному цвету?
vrabey
MetalHead
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class Frame(QtGui.QFrame):
    def __init__(self, parent=None):
        QtGui.QFrame.__init__(self, parent)
        self.setFrameShape(QtGui.QFrame.Box)
        self.setLineWidth(5)
        self.setStyleSheet('color: {0};'.format('#000000'))
        self.color_selector = False
        self.color_1 = "black"
        self.color_2 = "green"
    def mousePressEvent(self, event):
        if self.color_selector:
            color = self.color_1
            self.color_selector = not self.color_selector
        else:
            color = self.color_2
            self.color_selector = not self.color_selector
        self.setStyleSheet('color: {0};'.format(color))
class BaseWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(300, 200)
        self.frame = Frame(self)
        self.frame.setFixedSize(150, 150)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = BaseWindow()
    main.show()
    sys.exit(app.exec_())
MetalHead
Спасибо, сам сделал, что-то такое:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
class Frame(QtGui.QFrame):
    
    def __init__(self, parent=None):
        QtGui.QFrame.__init__(self, parent)
        self.setFrameShape(QtGui.QFrame.Box)
        self.setLineWidth(5)
        self.colr = self.setStyleSheet('QWidget {background: red;}')
        self.color = "red"
    def mousePressEvent(self, event):
        if self.color is "red":
            self.setStyleSheet('QWidget {background:green;}')
            self.color = "green"   
        else:
            self.setStyleSheet('QWidget {background: red;}')
            self.color = "red"
            
        return
class BaseWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(300, 200)
        self.frame = Frame(self)
        self.frame.setFixedSize(150, 150)
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    main = BaseWindow()
    main.show()
    sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB