Russian Qt Forum

Qt => Вопросы новичков => Тема начата: DruidCat от Май 15, 2017, 10:03



Название: QListView и QPainter
Отправлено: DruidCat от Май 15, 2017, 10:03
Друзья, помогите, я в тупике. Пишу свой диалог выбора шрифтов. Всё получается, кроме двух вещей:
1) В списке доступных шрифтов выделенный шрифт не фокуссируется, в системе много шрифтов, и список получается очень длинный, и приходится листать мышкой до выделенного шрифта, а хотелось бы, чтобы список автоматически пролистывается в QListView и выделенный шрифт был по середине этого списка.
Код:
QFontDatabase fdbShrifti;
QStringList slsShrifti;
slsShrifti = fdbShrifti.families();
m_pslmShrift = new QStringListModel();//в хидере QStringListModel* m_pslmShrift = 0;
m_pslmShrift->setStringList(slsShrifti);
ui->listView->setModel(m_pslmShrift);
m_pismShrift = new QItemSelectionModel(m_pslmShrift);//QItemSelectionModel* m_pismShrift = 0;
ui->listView->setSelectionModel(m_pismShrift);
QModelIndex mndShrift = m_pslmShrift->index(индекс в другом месте посчитал);
ui->listView->selectionModel()->select(mndShrift, QItemSelectionModel::SelectCurrent);
ui->listView->show();
Если будут ошибки в коде, то это я с телефона код писал на форуме, а это больно. Как сделать, чтобы выделенное имя шрифта ещё фокусировалось в списке?

2) И вторая моя боль, это показать пример отображения шрифта.
В учебнике нашёл пример:
Код:
QPainter pntShrift(this);
pntShrift.setFont(шрифт);
pntShrift.drawText(10, 40, "тест");
Но данный код я не могу всунуть в форму. Подскажите как? Может это сделать через графическую сцену? Я пробовал через сцена->render(&pntShrift); но ничего не отображалось. Други, помогите готовым кодом или ссылкой на него. Ничего не получается у меня. :-(


Название: Re: QListView и QPainter
Отправлено: gil9red от Май 15, 2017, 10:31
2. Создаете наследник QWidget, в нем переопределяете метод paintEvent и в этом методе тот код вызываете

По поводу 1. вам явно не нужно создавать новую QItemSelectionModel, т.к. по умолчанию у списка она есть


Название: Re: QListView и QPainter
Отправлено: DruidCat от Май 15, 2017, 11:38
QItemSelectionModel удалил и ничего не поменялось. Спасибо за совет, код стал более понятным. Но автофокусировка на выделенном шрифте не заработала. По поводу второго пункта я не понял. Я могу создать окно с QWidget и впихнуть тот код, он заработает. Проблема в том, что мне нужно использовать отображение шрифта в форме UI, где по так же будет нарисован список доступных шрифтов, его размеров, стиль и пресловутое наглядное отображение этого шрифта как есть. Или же я вас не понял по причине отсутствия моих очень скромных знаний.


Название: Re: QListView и QPainter
Отправлено: gil9red от Май 15, 2017, 12:05
1. Накидал код, работает (долго было запускать креатор, поэтому на питоне)

Код
C++ (Qt)
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
 
if __name__ == '__main__':
   app = QApplication([])
 
   fdbShrifti = QFontDatabase()
 
   m_pslmShrift = QStringListModel()
   m_pslmShrift.setStringList(fdbShrifti.families())
 
   listView = QListView()
   listView.setModel(m_pslmShrift)
   listView.show()
 
   index = m_pslmShrift.match(m_pslmShrift.index(0, 0), Qt.DisplayRole, 'Arial')[0]
   listView.setCurrentIndex(index)
 
   app.exec()
 

2. Тут 2 варианта:
 * Оставляете место в UI для того виджета, после добавляете в конструкторе класса (наверное это MainWindow)
 * Помещаете виджет на UI, правой кнопкой и тыкаете на "Преобразовать в..." после нужно выбрать тот виджет с переопределенным paintEvent'ом

В общем, тот виджет в любом случае делать нужно будет


Название: Re: QListView и QPainter
Отправлено: DruidCat от Май 15, 2017, 13:50
Спасибо большое, первую проблему решил, добавив строку:
Код:
ui->listView->setCurrentIndex(mndShrift);
По второй проблеме я понял в каком направлении рыть. Благодарю тебя дружище.
PS: GNU/Linux рулит и питон тоже рулит!