Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 21
PyQt5

Как добавить собственный виджет на Frame?

14.04.2019, 14:31. Показов 6179. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть такая проблема. Создал простенькое приложение - окно с ListWidget-ом. А если точней, то на форме лежит центральный виджет, на центральном виджете лежит фрейм, а на фрейме уже ListWidget.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QListWidget, QFrame
from PyQt5 import QtCore
from PyQt5.QtCore import Qt, QEvent
import sys
 
class My_ListWidget(QListWidget):
    def __init__(self):
        super(QListWidget, self).__init__()
        self.installEventFilter(self)
 
    def eventFilter(self, QObject, event):
        if event.type() == QEvent.MouseButtonPress:
            if event.button() == Qt.RightButton:
                print("Right button clicked")
        return False
 
 
class MainProgram(QMainWindow):
 
    def __init__(self):
        super(MainProgram, self).__init__()
 
        self.setFixedSize(800, 500)
 
# ----------------------------------------------------------------------------------
 
        self.centralwidget = QWidget(self)
        self.centralwidget.setMinimumSize(QtCore.QSize(800, 500))
 
# ----------------------------------------------------------------------------------
 
        self.frame = QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(20, 20, 700, 400))
 
# ----------------------------------------------------------------------------------
 
        self.listWidget = QListWidget(self.frame)
        self.listWidget.setGeometry(QtCore.QRect(0, 0, 120, 300))
 
 
def main():
    app = QApplication(sys.argv)
    MainProg = MainProgram()
    MainProg.show()
    sys.exit(app.exec_())
 
 
if __name__ == "__main__":
    main()
Вроде бы всё замечательно начиналось. Но тут мне понадобилось щелкая правой кнопкой мыши по пунктам ListWidget-та вызывать контекстное меню "Удалить пункт". Прочитал что для этого надо создавать свой класс например MyListWidget, в нем переопределять метод, что-то вроде этого:
Python
1
2
3
4
5
6
7
8
9
10
class My_ListWidget(QListWidget):
    def __init__(self):
        super(QListWidget, self).__init__()
        self.installEventFilter(self)
 
    def eventFilter(self, QObject, event):
        if event.type() == QEvent.MouseButtonPress:
            if event.button() == Qt.RightButton:
                print("Right button clicked")
        return False
Затем создал экземпляр уже моего класса MyListWidget:
Python
1
self.listWidget = MyListWidget(self.frame) вместо self.listWidget = QListWidget(self.frame)
Вышла ошибка: TypeError: __init__() takes 1 positional argument but 2 were given

Хотел бы узнать в чем проблема у знающих людей. Я сам не программист, пока еще не вижу общей картины, но пытаюсь освоить этот замечательный язык программирования.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2019, 14:31
Ответы с готовыми решениями:

QtCreator. Добавить на форму собственный виджет?
Код из файла.ui . Как программно добавить widget class="CustomGLWidget" name="glWidget" на форму? Решено: glWidget = new...

Как программно добавить Frame в другой существующий на форме frame?
Делаю это так: На форме лежит Frame1. на инициализации формы.... Dim mFrame As Object

Виджет label заменить на Frame
Все виджеты Label (метка), которые использовались в для размещения других виджетов, заменить на виджеты Frame (кадр). Если виджет Label...

3
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.04.2019, 13:01
Цитата Сообщение от Yevgeniy_F Посмотреть сообщение
class My_ListWidget(QListWidget):
* * def __init__(self):
* * * * super(QListWidget, self).__init__()
* * * * self.installEventFilter(self)
Цитата Сообщение от Yevgeniy_F Посмотреть сообщение
self.listWidget = QListWidget(self.frame)
Обрати внимание что твой класс при инициализации не принимает аргументов.
0
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 21
16.04.2019, 16:52  [ТС]
Спасибо, DmFat! Вот так работает:
Python
1
2
3
class My_ListWidget(QListWidget):
    def __init__(self, parent=None):
        super(My_ListWidget, self).__init__(parent)
А что в плане инструкций в конструкторе моего виджета, то это кажется я бред вычитал в инете.
Лучше для начала сделать как-то так:
Python
1
2
3
4
5
6
7
8
9
class MouseFilter(QObject):
    def __init__(self, parent=None):
        super(MouseFilter, self).__init__(parent)
 
    def eventFilter(self, obj_sourse, event):
        ...
        ...
      
        return super(MouseFilter, self).eventFilter(obj_sourse, event)
А потом:
Python
1
2
3
4
5
6
mouseFilter = MouseFilter()
 
...
 
listWidget = QListWidget(self.frame)
listWidget.installEventFilter(mouseFilter)
По ходу здесь и не требуется создавать наследуемый класс My_ListWidget.

Надо подумать над содержимым eventFilter.
Еще раз спасибо, DmFat!
0
0 / 0 / 0
Регистрация: 23.09.2013
Сообщений: 21
26.04.2019, 23:58  [ТС]
Снова столкнулся с подобной ситуацией. Создал два класса-потомка Widget и Frame на основе QWidget и QFrame, в случае с классом Frame объект myWidget прекрасно отображается и реагирует на мышь (см. print), в случае с классом Widget объект не отображается, но реагирует на мышь, и что самое интересное это то что при создании объекта класса QWidget, он нормально отображается и реагирует на мышь. Не могу понять чем отличается объект класса потомка Widget от объекта класса родителя QWidget? Возможно это глупый вопрос, и всё же я был бы очень признателен за разъяснение.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import sys
from PyQt5 import QtCore
from PyQt5.QtCore import QObject
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QFrame
 
 
class MouseFilter(QObject):
    def __init__(self, parent=None):
        super(MouseFilter, self).__init__(parent)
 
    def eventFilter(self, obj_sourse, event):
 
        if event.type() == QtCore.QEvent.Enter:
            print('into')
            obj_sourse.setStyleSheet('background-color: rgb(250, 155, 150);')
            return True
 
        if event.type() == QtCore.QEvent.Leave:
            obj_sourse.setStyleSheet('background-color: rgb(0, 255, 0);')
            print('out')
            return True
        else:
            return super(MouseFilter, self).eventFilter(obj_sourse, event)
 
 
class Frame(QFrame):
 
    def __init__(self, parent=None):
        super().__init__(parent)
 
 
class Widget(QWidget):
 
    def __init__(self, parent=None):
        super().__init__(parent)
 
 
class MainForm(QMainWindow):
 
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi()
 
    def setupUi(self):
        self.centralwidget = QWidget()
        self.centralwidget.setMinimumSize(QtCore.QSize(600, 500))
        self.setCentralWidget(self.centralwidget)
 
        self.myWidget = Frame(self.centralwidget)     # Случай №1 - нормально
        # self.myWidget = Widget(self.centralwidget)  # Случай №2 - не отображается
        # self.myWidget = QWidget(self.centralwidget) # Случай №3 - нормально
        
        self.myWidget.setGeometry(0, 0, 50, 50)
        self.myWidget.setStyleSheet('background-color: rgb(100, 100, 100);')
        self.myWidget.installEventFilter(MouseFilter(self.myWidget))
 
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    MF = MainForm()
    MF.show()
 
    sys.exit(app.exec_())
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2019, 23:58
Помогаю со студенческими работами здесь

Собственный виджет
Подскажие как создать простой виджет для социальных иконок. ...

Собственный виджет для tkinter
Здравствуйте. Подскажите, пожалуйста. Куда выложить свой виджет, чтобы кто-то мог воспользоваться им при необходимости? Заранее...

Не отображается собственный виджет в QMainWindow
Есть кастомный виджет BoxControl. Но он не отображается. Если заменить box = BoxControl(Window) на box = QtWidgets.QWidget(Window) то...

Как добавить дополнительный компонент на Frame?
Всем привет. Помогите разобраться как добавить дополнительную анимированную фигуру на панель. Добавлять дополнительный метод отрисовки...

Как добавить собственный шрифт?
Как добавить собсвенный шрифт в QT? Добавлено через 15 минут int loadedFontID = QFontDatabase::addApplicationFont (...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru