Найти - Пользователи
Полная версия: Почему не меняется размер шрифта в QTextEdit
Начало » GUI » Почему не меняется размер шрифта в QTextEdit
1
Kyrym
Написал программу для сравнения шрифтов (см. скриншот).



1). Проблема в том, что при изменении размера шрифта ничего не происходит. Как думаете, в чём моя ошибка?
2). Актуален вопрос про список шрифтов

——
По работе программы:
Левый ЛистВью содержит список всех шрифтов ОСи, в правый ЛистВью попадают шрифты для сравнения (нажатие по шрифту во втором списке удаляет элемент данного списка).

 # Python 3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
version = '2017.11.25' # Начало разработки
import sys, os
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
                         QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
                         QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
                         QGroupBox, QFileDialog, QMainWindow, QPlainTextEdit,
                         QStandardItem, QStandardItemModel, QListView, QListWidget,
                         QFontComboBox, QFontDatabase)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
from PyQt4.QtCore import QSize
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0; font: 14pt")
# ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
path_dir = '' # путь основного каталога
path_f = '' # путь открытого файла
# ГРАФИКА
        
class Window(QMainWindow):
    def __init__(self, parent=None, *args, **kwargs):
        QMainWindow.__init__(self, parent)
        super().__init__(parent, QtCore.Qt.Window)
        
        self.setMinimumSize(400, 300) # Ширина и высота окна
        self.resize(500, 500) # шир / выс окна
        self.setWindowTitle('Сравнение шрифтов – '+version) # Заголовок
        self.setWindowIcon(QIcon('icon.png')) # Иконка
        # ПОДКЛЮЧЕНИЕ СТИЛЕЙ
        '''sss = open('res/dark_blue.stylesheet', 'r')
        self.styleData = sss.read()
        sss.close()
        self.setStyleSheet(self.styleData)'''
        # Статус бар
        self.statusBar()
        # Пункты меню
        
        m_open_dir = QAction(QIcon('res_picture/apple_green.png'),
                             'Открыть директорию', self)
        #m_open_dir.triggered.connect(self.open_dir)
        m_settings = QAction(QIcon('res_picture/apple_green.png'),
                             'Настройки', self)
        #m_settings.triggered.connect(self.settings)
        # Меню программы
        menubar = self.menuBar()
        file_1 = menubar.addMenu('&Файл')
        file_1.addAction(m_open_dir)
        file_1.addAction(m_settings)
        file_2 = menubar.addMenu('&О программе')
        file_2.addAction('О программе')
   
      
        
        # БЛОК РАЗМЕТКИ
        grid_os = QGridLayout() # создание сетки
        grid_os.setSpacing(5)
        m = 6 # всего столбцов
        # --- ---
        self.pole_1 = QLineEdit()
        self.pole_1.setPlaceholderText('Введите текст')
        grid_os.addWidget(self.pole_1, 0,0,1,m-2)
        self.box_size = QComboBox()
        self.box_size.addItems(['10','12','14','16','18','20','28','40'])
        self.box_size.setCurrentIndex(5)
        self.box_size.setToolTip('Выбрать размер шрифта')
        self.box_size.activated[str].connect(self.on_start)
        #self.box_size.currentIndexChanged.connect(self.on_start)
        grid_os.addWidget(self.box_size, 0,m-2)
        self.button_vvod = QPushButton('Ввод')
        self.button_vvod.clicked.connect(self.on_start)
        grid_os.addWidget(self.button_vvod, 0,m-1)
        # --- ---
        lbl_1 = QLabel('<center>+ шрифт</center>')
        grid_os.addWidget(lbl_1, 1,0)
        lbl_2 = QLabel('<center>– шрифт</center>')
        grid_os.addWidget(lbl_2, 1,1)
        lbl_3 = QLabel('<center>Результат</center>')
        grid_os.addWidget(lbl_3, 1,2,1,m-2)
        # --- ---
        
        self.list_view_1 = QListView()
        grid_os.addWidget(self.list_view_1, 2,0)
        self.list_view_2 = QListView()
        self.list_view_2.clicked.connect(self.on_del)
        grid_os.addWidget(self.list_view_2, 2,1)
        self.pole_vivod = QTextEdit('')
        self.pole_vivod.setStyleSheet(sss_vivod)
        grid_os.addWidget(self.pole_vivod, 2,2,1,m-2)
        # --- ---
        
        self.box_font = QFontComboBox()
        #self.box_font.setToolTip('Выбрать шрифт')
        #self.box_font.activated[str].connect(self.on_start)
        #grid_os.addWidget(self.box_font, 3,0)
        
  
        # настройка
        grid_os.setColumnStretch(2, 1) # расширение правой части; индекс/растяж
        grid_os.setColumnMinimumWidth(3,200)
      
        
        # ---
        frame_os = QFrame()
        frame_os.setFrameShape(1)
        frame_os_lay = QVBoxLayout(frame_os)
        frame_os_lay.addLayout(grid_os)
        self.setCentralWidget(frame_os)
        # ====================
        self.lst_1 = []
        self.lst_2 = []
        self.model_list_2 = None        
        self.on_start()
        self.on_start_lst_1()
    # ЛОГИКА
    
    def on_start(self):
        def aps(i): # aps(список)
            i = ''.join(map(str, i))
            data.append(str(i))
           
        data = []
        self.pole_vivod.setText('')
        
        
        # ДАННЫЕ
        text = self.pole_1.text()
        if text == '':
            text = 'Введите текст'
        siz = int(self.box_size.currentText())
        print(siz)
        # ХОД
        for i in range(len(self.lst_2)):
            aps(['<font face="',self.lst_2[i],'" size=',siz,'>',text,'</font>',
                 '<br>(',self.lst_2[i],')'])
       
        
        # ВЫВОД ОТЧЁТОВ
        self.pole_vivod.setText('<hr>'.join(data))
        print('<br>'.join(data))
        self.pole_vivod.moveCursor(QTextCursor.Start)   
    def on_start_lst_1(self): # формирование первого списка
        self.box_font
        for i in range(len(self.box_font)):
            self.lst_1.append(self.box_font.itemText(i)) # из комбобокса
        model_list_1 = QStandardItemModel(self.list_view_1)
        for i in range(len(self.lst_1)):
            item = QStandardItem(self.lst_1[i])
            model_list_1.appendRow(item)
        self.list_view_1.setModel(model_list_1)
        self.list_view_1.clicked.connect(self.on_in_lst_2)
    def on_in_lst_2(self): # отправить в список 2
        index_row_1 = self.list_view_1.currentIndex().row()
        self.lst_2.append(self.lst_1[index_row_1])
        self.lst_2.sort()
        self.model_list_2 = QStandardItemModel(self.list_view_2)
        for i in range(len(self.lst_2)):
            item = QStandardItem(self.lst_2[i])
            self.model_list_2.appendRow(item)
        self.list_view_2.setModel(self.model_list_2)        
        self.on_start()
    def on_del(self): # удалить шрифт из второго списка
        index_row_2 = self.list_view_2.currentIndex().row()
        self.lst_2.pop(index_row_2)
        self.model_list_2.takeRow(index_row_2) # удалить строку из модели
        self.list_view_2.setModel(self.model_list_2) # установить новую модель
        self.on_start() # обновить поле вывода      
          
        
# КОНЕЦ
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window() # создаёт экземпляр окна из класса
    window.move(40, 20) # сдвиг окна от верхнего левого угла экрана
    window.show() # запускает окно
    sys.exit(app.exec_())
    

PEHDOM
мда, конечно радует что вы освоили метод строк join, а теперь откройте для себя еще и format , тогда вот этот ужас:
 def aps(i): # aps(список)   
            i = ''.join(map(str, i))
            data.append(str(i))
....
for i in range(len(self.lst_2)):
            aps(['<font face="',self.lst_2[i],'" size=',siz,'>',text,'</font>','<br>(',self.lst_2[i],')'])
можно заменить на чтото типа такого
         for i in range(len(self.lst_2)):
            data.append('<font face="{}", size={}>{}</font><br>({})'.format(self.lst_2[i], siz, text, self.lst_2[i]))
Kyrym
Проблема в том, что при изменении размера шрифта ничего не происходит. Как думаете, в чём моя ошибка?
ошибка в том что это не размер в точках(pt), а ХЗ вобщем в чем… но это что-то имеет градацию размера от 1 до 7 , и если значение больше 7 оно более не увеличивает.
установите
 self.box_size.addItems(['1','2','3','4','5','6','7','8', '9'])
чтобы убедиться в этом.

зачем вы переводите в int?
 siz = int(self.box_size.currentText())
вы же следующей строякой его опять в строку преобразовываете..
Kyrym
PEHDOM
зачем вы переводите в int?
Так я хотел избежать лишних кавычек, хотя, как выяснилось, их итак не будет.
PEHDOM
ошибка в том что это не размер в точках(pt), а ХЗ вобщем в чем… но это что-то имеет градацию размера от 1 до 7
Да, забыл я об этом. Переписал код через “p style”. Теперь работает, как задумано.
PEHDOM
а теперь откройте для себя еще и format
Про формат я знаю, просто мне как-то не сильно с ним удобно. Хотя конкретно в данном случае - да, format упростит общую конструкцию.
 # Python 3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
                         QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
                         QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
                         QGroupBox, QFileDialog, QMainWindow, QPlainTextEdit,
                         QStandardItem, QStandardItemModel, QListView, QListWidget,
                         QFontComboBox, QFontDatabase)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
from PyQt4.QtCore import QSize
# ЦВЕТА ПОЛЕЙ
sss_vivod = ("background-color: #456173; color: #f2f2f0;")
# ГРАФИКА
        
class Window(QMainWindow):
    def __init__(self, parent=None, *args, **kwargs):
        QMainWindow.__init__(self, parent)
        super().__init__(parent, QtCore.Qt.Window)
        
        self.setMinimumSize(400, 300) # Ширина и высота окна
        self.resize(800, 500) # шир / выс окна
        self.setWindowTitle('Сравнение шрифтов – '+version) # Заголовок
        self.setWindowIcon(QIcon('icon.png')) # Иконка
        # Статус бар
        self.statusBar()
        # Меню программы
        menubar = self.menuBar()
        file_2 = menubar.addMenu('&О программе')
        file_2.addAction('Пусто')
   
      
        # БЛОК РАЗМЕТКИ
        grid_os = QGridLayout() # создание сетки
        grid_os.setSpacing(5)
        m = 6 # всего столбцов
        # --- ---
        self.pole_1 = QLineEdit()
        self.pole_1.setPlaceholderText('Введите текст')
        grid_os.addWidget(self.pole_1, 0,0,1,m-2)
        self.box_size = QComboBox()
        self.box_size.addItems(['10','12','14','16','18','20','28','40','60'])
        self.box_size.setCurrentIndex(6)
        self.box_size.setToolTip('Выбрать размер шрифта')
        self.box_size.activated[str].connect(self.on_start)
        grid_os.addWidget(self.box_size, 0,m-2)
        self.button_vvod = QPushButton('Ввод')
        self.button_vvod.clicked.connect(self.on_start)
        grid_os.addWidget(self.button_vvod, 0,m-1)
        # --- ---
        lbl_1 = QLabel('<center>+ шрифт</center>')
        grid_os.addWidget(lbl_1, 1,0)
        lbl_2 = QLabel('<center>– шрифт</center>')
        grid_os.addWidget(lbl_2, 1,1)
        lbl_3 = QLabel('<center>Результат</center>')
        grid_os.addWidget(lbl_3, 1,2,1,m-2)
        # --- ---
        
        self.list_view_1 = QListView()
        grid_os.addWidget(self.list_view_1, 2,0)
        self.list_view_2 = QListView()
        self.list_view_2.clicked.connect(self.on_del)
        grid_os.addWidget(self.list_view_2, 2,1)
        self.pole_vivod = QTextEdit('')
        self.pole_vivod.setStyleSheet(sss_vivod)
        grid_os.addWidget(self.pole_vivod, 2,2,1,m-2)
        # --- ---
 
        # настройка
        grid_os.setColumnStretch(2, 1) # расширение правой части; индекс/растяж
        grid_os.setColumnMinimumWidth(3,200)
      
        
        # ---
        frame_os = QFrame()
        frame_os.setFrameShape(1)
        frame_os_lay = QVBoxLayout(frame_os)
        frame_os_lay.addLayout(grid_os)
        self.setCentralWidget(frame_os)
        # ====================
        self.lst_1 = [] # список всех шрифтов системы
        self.lst_2 = [] # список избранных шрифтов
        self.model_list_2 = None        
        # Автозапуск функций
        self.on_start()
        self.on_start_lst_1()
    # ЛОГИКА
    
    def on_start(self):
        text = self.pole_1.text()
        if text == '':
            text = 'Введите текст'
        siz = self.box_size.currentText() # размер шрифта
        #print(siz)
        data = []
        for i in range(len(self.lst_2)):
            data.append('<p style="font-family:{}; font-size:{}px; margin-top:0px; margin-bottom:0px">{}</p>\
                         <p style="font-size:14px; margin-top:0px; margin-bottom:0px">({})</p>\
                         '.format(self.lst_2[i], siz, text, self.lst_2[i]))
        
        # ВЫВОД
        self.pole_vivod.setText('<hr>'.join(data))
        #print('<br>'.join(data))
        self.pole_vivod.moveCursor(QTextCursor.Start)
    def on_start_lst_1(self): # формирование первого списка
        obj_font = QtGui.QFontDatabase() # объект класса базы шрифтов
        self.lst_1 = obj_font.families() # list_font
        
        model_list_1 = QStandardItemModel(self.list_view_1)
        for i in range(len(self.lst_1)):
            item = QStandardItem(self.lst_1[i])
            model_list_1.appendRow(item)
        self.list_view_1.setModel(model_list_1)
        self.list_view_1.clicked.connect(self.on_in_lst_2)
    def on_in_lst_2(self): # отправить в список 2
        index_row_1 = self.list_view_1.currentIndex().row()
        row_1 = self.lst_1[index_row_1]
        if self.lst_2.count(row_1) == 1: # не допустить повторы
            pass
        else:
            self.lst_2.append(row_1)
            self.lst_2.sort()
    
            self.model_list_2 = QStandardItemModel(self.list_view_2)
            for i in range(len(self.lst_2)):
                item = QStandardItem(self.lst_2[i])
                self.model_list_2.appendRow(item)
    
            self.list_view_2.setModel(self.model_list_2)        
    
            self.on_start()
    def on_del(self): # удалить шрифт из второго списка
        index_row_2 = self.list_view_2.currentIndex().row()
        self.lst_2.pop(index_row_2)
        self.model_list_2.takeRow(index_row_2) # удалить строку из модели
        self.list_view_2.setModel(self.model_list_2) # установить новую модель
        self.on_start() # обновить поле вывода      
          
        
# КОНЕЦ
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.move(40, 20) # сдвиг окна от верхнего левого угла экрана
    window.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