Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 28, 2014 18:41:01

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

Всем добрый вечер, писал несложный скрипт столкнулся с небольшой проблемой. При клике по обычной кнопке достаточно написать:

button.clicked.connect(action)
А вот для виджета QFrame что-то не могу найти. Перерыл много англоязычных сайтов. Нужно чтобы фрейм отзывался на клик мыши. Спасибо.

Отредактировано MetalHead (Авг. 28, 2014 18:41:30)

Офлайн

#2 Авг. 28, 2014 21:03:27

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

можно наследовать QFrame и в самом классе переопределить метод -

mousePressEvent
но если задача стоит - кликнуть только на рамке то не получается - метод срабатывает и внутри рамки

Отредактировано vrabey (Авг. 28, 2014 21:03:48)

Офлайн

#3 Авг. 29, 2014 10:22:16

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

Спасибо, замучился, наследовал, переопределил, но говорит нету у 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()

Офлайн

#4 Авг. 29, 2014 10:49:38

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

MetalHead
а мог бы ты словами объяснить чего хочешь, что должен фрейм делать, и какие ошибки получаешь
в твоём коде есть опечатки
у меня в таком виде он вообще не запускается

что бы кликнуть по виджету его надо отобразить а где у тебя фрейм отображается?

Отредактировано vrabey (Авг. 29, 2014 10:52:23)

Офлайн

#5 Авг. 29, 2014 11:12:56

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

vrabey
MetalHeadа мог бы ты словами объяснить чего хочешь, что должен фрейм делать, и какие ошибки получаешьв твоём коде есть опечаткиу меня в таком виде он вообще не запускаетсячто бы кликнуть по виджету его надо отобразить а где у тебя фрейм отображается?
Мне нужно, чтобы фрейм реагировал на клик, меняя свой цвет. Да знаю, что есть ошибка. Как мне наследовать QFrame, что-то плохо у меня с ООП, простите.

Офлайн

#6 Авг. 29, 2014 11:55:42

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

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

Офлайн

#7 Авг. 29, 2014 12:01:53

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

Вот за это большущее спасибо.

Офлайн

#8 Авг. 29, 2014 12:23:34

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

Еще одно такое пожелание, как сделать так чтобы при повторном нажатии на фрейм он возвращался к исходному цвету?

Офлайн

#9 Авг. 29, 2014 12:36:31

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

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

Офлайн

#10 Авг. 29, 2014 12:41:00

MetalHead
От: Ленгер
Зарегистрирован: 2013-12-17
Сообщения: 88
Репутация: +  1  -
Профиль   Отправить e-mail  

QFrame. Привязать сигнал

Спасибо, сам сделал, что-то такое:

#!/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_())

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version