Russian Qt Forum

Qt => Общие вопросы => Тема начата: pastor от Июнь 09, 2009, 00:51



Название: ICS Network - The Place to Learn Advanced Techniques for Developing with Qt
Отправлено: pastor от Июнь 09, 2009, 00:51
Зашел вот на форум crossplatform и увидел тему созданную SABROG про ICS Network и думаю дайка создам аналогичную тему у нас на форуме. Думал создать такую темку ещё с годик назад, но ввиду того что многие форумчане несильны в английском - не решился.

Ну да ладно, это все лирика... :)

ICSNetwork - это информационный ресурс компании ICS, предназначены для изучение дополнительный приемов разработки на Qt. Как по мне, этот ресурс имеет ценность для новичков в Qt. В ICSNetwork можно найти вэбкасты, статьи.

И так, вышеперечисленный материал можно найти здесь:

Вэбкасты: ICSNetwork (http://www.ics.com/learning/icsnetwork/)
Статьи: Qt White Papers (http://www.ics.com/learning/learning_center_downloads/)

ЗЫ: Список статей и вебкастов постоянно обновляется
ЗЗЫ: Замечания и пожелания приветствуются :)


Название: Re: ICS Network
Отправлено: Admin от Июнь 09, 2009, 09:52
Я бы еще описание добавил - что это такое,  с чем едят ) А то мне ничего не понятно(


Название: Re: ICS Network - The Place to Learn Advanced Techniques for Developing with Qt
Отправлено: SABROG от Июнь 10, 2009, 15:43
Хочу заметить, что для того, чтобы что-то читать или смотреть надо зарегистрироваться. Чтобы качать white papers нужно выделить галочкой нужную тему и нажать на Download, pdf'ка придет на e-mail.

Чем-то напоминает Qt Quarterly. Например интересную штуку почерпнул, как оптимизировать свой paintEvent, если используется QFontMetrics, чтобы определить размер шрифта. Обычно код выглядит подобным образом:

Код
C++ (Qt)
MyWidget::paintEvent( QPaintEvent* evt )
{
QFontMetrics fm( font() );
int textWidth = fm.width( text() );
int textHeight = fm.height();
// compute layout of the widget using textWidth and
// textHeight, then paint
}
 

Идея в том, чтобы объявить переменную этого класса в классе виджета и переопределить setFont.
Код
C++ (Qt)
class MyWidget
{
...
QFontMetrics mFm;
...
};
 

Код
C++ (Qt)
void MyWidget::setFont( const QFont& newFont )
{
mFm = QFontMetrics( newFont );
QWidget::setFont(newFont);
}
 

Код
C++ (Qt)
MyWidget::paintEvent( QPaintEvent* evt )
{
int textWidth = mFm.width( text() );
int textHeight = mFm.height();
// compute layout of the widget using textWidth and
// textHeight, then paint
}
 

Чтобы еще больше оптимизировать объявляем переменные mTextWidth/mTextHeight в классе виджета...:

Код
C++ (Qt)
void MyWidget::computeTextWidthHeight()
{
mTextWidth = mFm.width( text() );
mTextHeight = mFm.height();
}
 

Код
C++ (Qt)
void MyWidget::setText( const QString& newText )
{
QWidget::setText( newText );
computeTextWidthHeight()
}
 
void MyWidget::setFont( const QFont& newFont )
{
mFm = QFontMetrics( newFont );
QWidget::setFont( newFont );
computeTextWidthHeight();
}
 

Теперь в paintEvent'е всегда известен размер шрифта, который используется в этом виджете, даже если шрифт меняется.


Название: Re: ICS Network - The Place to Learn Advanced Techniques for Developing with Qt
Отправлено: navrocky от Сентябрь 28, 2010, 11:23
Можно еще так:
Код
C++ (Qt)
MyWidget::paintEvent( QPaintEvent* evt )
{
   if (old_font_ != font())
   {
       QFontMetrics fm( font() );
       text_width_ = fm.width( text() );
       text_height_ = fm.height();
       old_font_ = font();
   }
 
   // paint here
}
 


Название: Re: ICS Network - The Place to Learn Advanced Techniques for Developing with Qt
Отправлено: twp от Декабрь 10, 2010, 11:51
Можно, но не нужно - хранить одну переменную класса ради такого фокуса? хм


Название: Re: ICS Network - The Place to Learn Advanced Techniques for Developing with Qt
Отправлено: Akon от Февраль 13, 2012, 09:57
Цитировать
Например интересную штуку почерпнул, как оптимизировать свой paintEvent, если используется QFontMetrics, чтобы определить размер шрифта. Обычно код выглядит подобным образом:
Так это элементарное кэширование, и как-то хоть немного сильно думать для этого не нужно.

Переопределение setFont() (в общем случае перекрытие невиртуальных методов) вообще потенциально бажная идея:
Код:
QWidget* widget = new MyWidgetWithSetFontOverriding;
widget->setFont(...);   // вот тут нихрена не MyWidgetWithSetFontOverriding::setFont.
Правильно - реагировать на событие fontChanged.