перевод Andi Peredri
В Qt 3.1 внесено множество улучшений с целью сделать программирование с Qt более простым и продуктивным. В этой статье рассказывается, как лучше использовать новые возможности Qt в ваших проектах. Для ознакомления с полным списком изменений см. http://www.trolltech.com/developer/changes/3.1.html.
Нововведения |
Основными нововведениями Qt 3.1 являются следующие:
Больше возможностей |
Во множество классов Qt 3.1 были добавлены новые возможности. Некоторые из этих изменений будут оценены пользователями Qt-приложений, другие - разработчиками.
Улучшения в редакторе текста |
Класс QTextEdit был улучшен во многих отношениях. Но наиболее важным является появление интерактивной синтаксической подсветки, поддержка которой обеспечивается абстрактным классом QSyntaxHighlighter.
Другим существенным улучшением QTextEdit является новый режим LogText, который предназначен для отображения очень больших текстов. В этом режиме данные сохраняются в памяти очень эффективным способом и предоставляются некоторые возможности режима RichText.
Поддержка сжатия данных |
Для обеспечения сжатия и декомпрессии данных QByteArray Qt 3.1 предлагает две функции: qCompress() и qUncompress().
Настраиваемость элементов интерфейса |
Элементы интерфейса QToolButton, QGroupBox и QColorDialog стали более настраиваемы в Qt 3.1.
Более гибкая обработка событий |
В Qt 3.1 появился класс QEventLoop, который обеспечивает более гибкое управление очередью событий. Для большинства приложений важным нововведением станет возможность поддерживать пользовательский интерфейс доступным во время продолжительной обработки данных. Это достигается следующим образом:
QEventLoop *loop = qApp->eventLoop(); loop->processEvents( QEventLoop::ExcludeUserInput );
Невидимые пункты меню |
Qt 3.1 поддерживает невидимые пункты меню. В отличие от заблокированных (disabled) пунктов, которые отображаются серым, невидимые пункты не показываются вовсе.
Чтобы сделать пункт меню невидимым, вызовите setItemVisible(id, FALSE). Чтобы сделать невидимым элемент QAction, вызовите setVisible(FALSE).
Динамическая компоновка |
Класс компоновки QLayout предоставляет две новые функции: remove() и removeItem(), которые позволяют удалять элементы интерфейса из компоновщика. Эти функции делают возможным перемещение элементов интерфейса из одного компоновщика в другой во время выполнения.
Уточненный размер экрана |
Класс QDesktopWidget впервые появился в Qt 3.0 для обеспечения доступа к экранной информации в системах с несколькими мониторами (multi-head systems). В Qt 3.1 были добавлены функции screenGeometry() и availableGeometry(). Первая возвращает размер экрана (объект QRect), а вторая - размер области экрана, не занятой панелью задач в Windows или доком и строкой меню в Mac OS X.
Более управляемые HTTP и FTP |
Классы QHttp и QFtp являются подклассами QNetworkProtocol и предоставляют единообразный высокоуровневый интерфейс, который избавляет разработчиков от низкоуровневых деталей реализации. В Qt 3.1 интерфейсы этих классов были расширены: они могут использоваться, как прежде, но теперь они также предоставляют низкоуровневый доступ для обеспечения лучшего контроля. Оба класса работают асинхронно и могут ставить запросы в очередь.
Много-клавишные комбинации |
Класс QKeySequence впервые появился в Qt 3.0 для хранения клавиатурных комбинаций (например, "Ctrl+Q"). В Qt 3.1 использование слова "sequence" (последовательность) в названии класса полностью себя оправдало, и много-клавишные комбинации, такие как "Ctrl+X,Ctrl+S" и "Alt+M,A,Z" теперь поддерживаются:
action->setAccel( tr("Ctrl+X,Ctrl+S") ); action->setAccel( QKeySequence(ALT+Key_M, Key_A, Key_Z) );
Улучшенная поддержка многопоточности |
Поддержка потоков в Qt 3.1 была значительно улучшена. Почти во все классы инструментов ( QString, QRegExp, QValueList и т.д.) была добавлена поддержка реентерабельности (reentrancy). Если Qt была скомпилирована с поддержкой многопоточности, для QApplication::postEvent() и некоторых других функций теперь обеспечивается потоко-независимое выполнение (thread-safety). В документации Qt теперь четко указывается, поддерживает ли класс или функция эти возможности.
Проще и лучше |
В каждой версии Qt появляются новые или перегруженные для удобства функции. Qt 3.1 включает некоторые функции, которые потенциально могут изменить ваш код.
QWidget::setShown() и setHidden() |
Часто встречается такое использование API QWidget:
void MyWidget::showChildWidget( bool showIt ) { if ( showIt ) childWidget->show(); else childWidget->hide(); }
childWidget->setShown( showIt );
Кодек для C-строк |
В предыдущих версиях Qt при конвертировании строк из 8-битного формата в QString
предполагалось, что используется кодировка Latin-1. Теперь это может быть изменяемо.
Например, следующий код инициализирует переменную типа QString строкой
на корейском "":
QTextCodec::setCodecForCStrings( QTextCodec::codecForName("EUC-KR") ); str = "\273\363\300\247 \265\360\267\272\305\344\270\256";
str = "<img src='http://www.crossplatform.ru/uploads/articles/qq04-koreangreen.png' tppabs='http://doc.trolltech.com/qq/qq04-koreangreen.png' alt='Koreangreen'/>";<br />
В редакторе с поддержкой Latin-1 этот файл выглядел бы следующим образом:
str = "»уА§ µр·єЕд ®";
Это небольшое дополнение позволяет использовать для написания кода программ любые кодировки.
Перегрузка QWidget::setSizePolicy() |
Большинство разработчиков используют класс QSizePolicy только в паре с Qt Designer. Но если вы пишите код самостоятельно, то вы можете заменить строку:
widget->setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed) );
widget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
Перегрузка QString::replace() |
В предыдущих версиях Qt была доступна только одна перегруженная функция QString::replace(), которая заменяла в строке все совпадения с первым аргументом QRegExp своим вторым аргументом. Это приводило к использованию тривиальных регулярных выражений, например:
str.replace( QRegExp("\r\n"), "\n" );
str.replace( "\r\n", "\n" );<br />
Это быстрее работает и избавляет от необходимости включать
Возможности перегруженных функций QString::replace() были расширены за счет следующих изменений:
Совместимость со стандартными строками C++ |
Совместимость с STL-контейнерами впервые появилась в Qt 3.0. В Qt 3.1 также поддерживается совместимость со стандартным классом C++ std::string. В результате теперь вы можете писать так:
std::string stroustrup = "Hello"; QString eng = stroustrup;
QString nord = "World"; std::string stroustrup = nord;
Функции QMap::keys() и QMap::values() |
Класс QMap предлагает очень быстрый поиск, вставку и удаление в словаре. Удобный синтаксис обеспечивается перегрузкой операторов C++. Но в интерфейсе Qt часто используется класс QValueList (или QStringList), поэтому вам приходилось извлекать все ключи:
QStringList keys; QMap<QString, int>::ConstIterator it = map.begin(); while ( it != map.end() ) { keys.append( it.key() ); ++it; }
QStringList keys = map.keys();
QValueList<int> values = map.values();
Функции QString::startsWith() и endsWith() |
Функция QString::startsWith() впервые появилась в Qt 2.2, а функция QString::endsWith() - в Qt 3.0. Хотя это и выходит за рамки статьи о Qt 3.1, многим разработчикам эти функции все же не известны. Прежний стиль:
if ( url.left(5) == "http:" && (url.right(5) == ".html" || url.right(4) == ".xml") )
if ( url.startsWith("http:") && (url.endsWith(".html") || url.endsWith(".xml")) )
Новый стиль проще, меньше подвержен ошибкам и немного уменьшает размер выполнимого файла.
Простое управление потоками |
Новый класс QMutexLocker упрощает блокировку и разблокировку потоков. Это очень простой класс: его конструктор блокирует выполнение других потоков в определенном месте кода, а его деструктор разблокирует их. Вот пример:
int complex_function( int flag ) { QMutexLocker locker( &my_mutex ); if ( flag == 0 || flag == 1 ) { return less_complex_function( flag ); } else if ( flag > 10 ) { return -1; } return 0; }
Copyright © 2002 Trolltech. | Trademarks |