Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Кроме представленных здесь возможностей компания «Trolltech» предлагает несколько зависимых от платформы решений в рамках проекта Qt Solutions, в частности миграционные фреймворки Qt/Motif и Qt/MFC, позволяющие упростить перевод в Qt приложений Motif/Xt и MFC. Подобное расширение для приложений Tcl/Tk обеспечивается фирмой «Froglogic», а компанией «Klaralvdalens Datakonsult» разработан конвертор ресурсов Windows компании Microsoft. Дополнительную информацию вы найдете на следующих веб-страницах:

• http://www.trolltech.com/products/solutions/catalog/

• http://www.froglogic.com/tq/

• http://www.kdab.net/knut/

Для встроенных приложений компания «Trolltech» обеспечивает Qtopia — рабочую среду для разработки таких приложений. Она рассматривается в главе 21 .

Применение «родных» программных интерфейсов

Всесторонний программный интерфейс Qt удовлетворяет большинству требований на всех платформах, но при некоторых обстоятельствах нам может потребоваться базовый, платформозависимый программный интерфейс. В данном разделе мы продемонстрируем способы применения «родных» программных интерфейсов различных платформ, поддерживаемых Qt, для решения конкретных задач.

Для каждой платформы класс QWidget поддерживает функцию winId, которая возвращает идентификатор или описатель окна. QWidget также обеспечивает статическую функцию find, которая возвращает QWidget с идентификатором конкретного окна. Мы можем передавать этот идентификатор функциям «родного» программного интерфейса для достижения эффектов, зависимых от платформы. Например, в следующем программном коде используется функция winId для отображения слева заголовка панели инструментов, используя «родные» функции Mac OS X:

#ifdef Q_WS_MAC

ChangeWindowAttributes(HIViewGetWindow(HIViewRef(toolWin.winId)),

kWindowSideTitlebarAttribute, kWindowNoAttributes);

#endif

Рис. 20.1. Окно панели инструментов Mac OS X с отображением заголовка сбоку.

Ниже показано, как в системе X11 мы можем модифицировать свойство окна:

#ifdef Q_WS_X11

Atom atom = XInternAtom(QX11Info::display, "MY_PROPERTY", False);

long data = 1;

XChangeProperty(QX11Info::display, window->winId, atom, atom,

32, PropModeReplace, reinterpret_cast<uchar *>(&data), 1);

#endif

Использование директив #ifdef и #endif вокруг зависимого от платформы программного кода гарантирует компиляцию приложения на других платформах.

Приведенный ниже пример показывает, как в приложениях, предназначенных только для Windows, можно использовать вызовы GDI для рисования на виджете Qt:

01 void GdiControl::paintEvent(QPaintEvent * /* event */)

02 {

03 RECT rect;

04 GetClientRect(winId, &rect);

05 HDC hdc = GetDC(winId);

06 FillRect(hdc, &rect, HBRUSH(COLOR_WINDOW + 1));

07 SetTextAlign(hdc, TA_CENTER | TA_BASELINE);

08 TextOutW(hdc, width / 2, height / 2,

09 text.utf16, text.size);

10 ReleaseDC(winId, hdc);

11 }

Чтобы это сработало, мы должны также переопределить функцию QPaintDevice::paintEngine для возврата нулевого указателя и установить атрибут Qt::WA_PaintOnScreen в конструкторе виджета.

Следующий пример показывает, как можно сочетать QPainter и GDI в обработчике события рисования, используя функции getDC и releaseDC класса QPaintEngine:

01 void MyWidget::paintEvent(QPaintEvent * /* event */)

02 {

03 QPainter painter(this);

04 painter.fillRect(rect.adjusted(20, 20, -20, -20), Qt::red);

05 #ifdef Q_WS_WIN

06 HDC hdc = painter.paintEngine->getDC;

07 Rectangle(hdc, 40, 40, width - 40, height - 40);

08 painter.paintEngine->releaseDC;

09 #endif

10 }

  • Читать дальше
  • 1
  • ...
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: