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

Создание окна чата

29.09.2022, 14:55. Показов 1057. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Подскажите пожалуйста куда копать. Написал консольный вариант кастомного клиента Telegram. Теперь хочу создать графический интерфейс на PyQT5 (изучаю на ходу) напоминающий официальный клиент. Не могу понять как реализовали в Telegram окно чата. Вариант QTableView, мне не нравится, как бы я визуально не пытался повторить. Что можно использовать помимо таблицы, какой набор виджетов. Даже вставлял, HTML страницу в качестве отображения чата, но не хочу в этом направление двигаться.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2022, 14:55
Ответы с готовыми решениями:

Посоветуйте подходящий Control для окна сообщений чата
Всех приветствую! Подскажите пожалуйста, какой из инструментов стандартных можно было бы использовать для отображения переписки в чате? ...

Немодальные окна для чата, вызываемые из потока основной формы
Уважаемые, дописываю курсач и вот напололся на проблему... Пишу чат IRC, общение в каналах худо-бедно сделал, работает. Но тут дошло...

Создание чата
Привет всем. Подскажите как осуществить приложения что то типа локального чата. Как я понимаю, приложение должно содержать и клиент и...

1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.09.2022, 01:23
ну например QGraphicsView/QGraphicsScene там функционал богатый
ИМХО надо делать функционал отдельных сообщений, в телеге там не просто текст
https://github.com/baoboa/pyqt... les/qtdemo
посмотрите примеры

Добавлено через 2 часа 32 минуты
для простого чата ИМХО и QTableView хватит
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from PyQt5.QtWidgets import (QApplication, QTableView,)
from PyQt5.QtCore import QAbstractTableModel, QModelIndex, Qt
from PyQt5.QtGui import QColor, QFont, QBrush
 
class TableModel(QAbstractTableModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checked = [] 
                
    def rowCount(self, index=None):
        return len(self._data)
        
    def columnCount(self, index=None):
        return 1
                
    def data(self, index, role=Qt.DisplayRole):
        if not index.isValid(): 
            return None
        row,col = index.row(), index.column()
        if role == Qt.DisplayRole :
            return(self._data[row])
        elif role == Qt.BackgroundRole:
            if not row % 3 :
                return QBrush(QColor(0,255,0,32))
        elif role == Qt.TextAlignmentRole:
            if row % 3:
                return  Qt.AlignLeft 
            return Qt.AlignRight
        elif role == Qt.CheckStateRole:
            if self._checked[row]:
                return Qt.Checked
            return Qt.Unchecked
            
    def setData(self, index, value, role = Qt.EditRole):
        if (role==Qt.CheckStateRole):
            self._checked[index.row()] ^= True
        return True
 
    
    def headerData(self,section, orientation, role):
        if orientation == Qt.Horizontal:
            if role == Qt.DisplayRole:
                return "Chat messages"
 
    def flags(self,index):
        if not index.isValid(): 
            return Qt.NoItemFlags
        return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsSelectable
        
    def load_data(self, array):
        self.beginResetModel()
        self._data = array
        self._checked = [False] * len(array) 
        self.endResetModel()
        
 
class View(QTableView):
    def __init__(self):
        super().__init__()
        model = TableModel()
        self.horizontalHeader().setSectionResizeMode(1)
        model.load_data([
        'qwerty', 
        'Очень\n длинное\n сообщение',
        'eeeee dddddd', 
        'zzzzz zzzzzz'
        ])
        self.setModel(model)
        self.resizeRowsToContents()
        self.resizeColumnsToContents()
                    
                
if __name__=="__main__":
    app = QApplication([])
    w = View()
    w.setFont(QFont('times',16))
    w.resize(300,400)
    w.show()
    app.exec_()
Добавлено через 5 часов 1 минуту
для примера - QGraphicsView
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
from PyQt5.QtWidgets import (QApplication,QGraphicsItem,
    QGraphicsScene,QGraphicsView,QGraphicsItemGroup,
    QGraphicsRectItem,QGraphicsTextItem, QGraphicsEllipseItem)
 
from PyQt5.QtCore import Qt, QRect, QPointF
from PyQt5.QtGui import QPainter, QColor, QPen, QFont, QBrush
 
class Message(QGraphicsRectItem):
    def __init__(self, txt =""):
        super().__init__()
        text = QGraphicsTextItem()
        text.setFont(QFont('times',16))
        text.setHtml(txt)
        text.setPos(32,0)
        text.setParentItem(self)
        
        label = QGraphicsEllipseItem(0,0,16,16)
        label.setBrush(Qt.cyan)
        label.setPen(QColor(0,0,0,0))
        label.setParentItem(self)
        label.setPos(10,10)
        
        self.setFlags(QGraphicsItem.ItemIsSelectable)
        self.setBrush(QColor(0,225,0,64))
        self.setPen(QColor(0,0,0,0))
        rect = text.boundingRect()
        p1,p2 = rect.topLeft(), rect.bottomRight() + QPointF(32,0)
        self.setRect(p1.x(),p1.y(),p2.x(),p2.y())
 
app = QApplication([])
x,y = 10,10
offset = 30
scene = QGraphicsScene()
for i in range(40):
    item = Message("<h2>Header</h2>" +"text_item "*(i%5 + 1) +'<br>'*(i%3) + str(i))
    item.setPos(x,y)
    scene.addItem(item)
    y += item.rect().height() + 5
    if i%2 : x += offset
    else : x -= offset
        
view = QGraphicsView()
view.setRenderHint(QPainter.Antialiasing)
view.setBackgroundBrush(QColor(0,1,2,16))
view.setScene(scene)
view.resize(400,600)
view.show();
app.exec()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2022, 01:23
Помогаю со студенческими работами здесь

Создание чата
Вот такую я намутил: https://yadi.sk/d/siDEQMpjr4oht Мне необходимо что бы клиент автоматом подключался к уже заданному в коде ip и...

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

Создание чата
В инете много написано о создании чата, но мне это не подходит. Вот в примере №1. Сообщение отсылаются всем пользователем, т.е. у всех у...

Создание чата на С++
Я пытаюсь создать ча С++ используя сокеты. С++ изучаю достаточно давно, но нормальной статьи с примерами и разбором синтаксиса по сокетам...

Создание чата
Доброго времени суток! Хочется попробовать создать чат(в командной строке) между разными компьютерами, на плюсах. Что можно почитать в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru