Создание элементов управления в стиле капсулы в Qt - PullRequest
4 голосов
/ 31 августа 2010

Как лучше всего визуализировать элементы управления панели инструментов в капсульном стиле (включая текст надписи под кнопками) в приложении Qt?

Что касается рендеринга кнопок, я хочумаксимально использовать возможности Mac OS.(Я не разработчик для Mac, поэтому не знаю, есть ли у него API для этого.) То есть я знаю, что могу сам рисовать их, использовать таблицы стилей для border-image, угадывать шрифт и устанавливать все этов макете, но есть ли лучший способ, который обеспечивает последовательную презентацию, когда Mac обновляет свой «внешний вид»?Я использую C ++ в Qt.

. Я не ненавижу идею использования Q_WS_MAC для получения визуализации для конкретной платформы, но есть ли в Qt что-нибудь для этого?Вы знаете, метод setCapsuleStyle(true) где-нибудь?:)

Спасибо за любые предложения.

Ответы [ 3 ]

3 голосов
/ 01 сентября 2010

В репозитории qt-labs есть пример сегментированной кнопки, который выглядит достойно на KDE. В нем достаточно кода #ifdef Q_WS_MAC, но я не знаю, насколько хорошо он рендерится на Mac. Вы можете найти это здесь .

Если вы нацелены только на Mac, вы можете использовать QMacCocoaViewContainer для рендеринга собственных сегментированных кнопок. Кривая обучения довольно крутая, поэтому вы можете найти этот пост в блоге Qt Labs о виджете Mac интересным: аддоны стиля виджетов Mac . Автор предоставляет три виджета в стиле Mac: QtCocoaPushButton, QtCocoaComboBox и QtCocoaSegmentedButton.

1 голос
/ 05 сентября 2010

Поскольку Qt не предоставляет этот вид виджета сам по себе, лучшим способом было бы создание подкласса QPushButton и переопределение paintEvent.Затем вы можете нарисовать ваше растровое изображение капсулы, просто нарисовав QPixmap, который содержит скриншот кнопки капсулы.Вы можете добавить поведение щелчка, переопределив mousePressEvent и mouseReleaseEvent.

// CapsuleButton.h
class CapsuleButton : public QPushPutton {
   // ...
protected:
   void paintEvent(QPaintEvent*);
   void mousePressEvent(QMouseEvent*);
   void mouseReleaseEvent(QMouseEvent*);
   // ...
private:
   QPixmap pixmap_;
   QPixmap pressedPixmap_;
   bool pressed_;
};

// CapsuleButton.cpp
CapsuleButton::CapsuleButton(QObject* parent) : 
    QPushButton(parent),
    pixmap_(":/capsule-button-background.png"),
    pressedPixmap_(":/capsule-button-background-pressed.png"),
    pressed_(false)
{ /*...*/ }

void CapsuleButton::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawPixmap(rect(), pressed_? pressedPixmap_ : pixmap_);
}

void CapsuleButton::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton)
       pressed_ = true;
    update();
}

void CapsuleButton::mouseReleaseEvent(QMouseEvent*)
{
    pressed_ = false;
    update();
}

. Я написал краткое руководство по созданию пользовательских виджетов: http://www.serenethinking.com/2010/08/how-to-create-custom-widgets-with-qt/

Возможно, это поможет.

0 голосов
/ 28 июля 2011

Я делал подобные вещи в прошлом.К сожалению, у меня нет его исходного кода, чтобы поделиться с вами.Однако наиболее безопасным вариантом является использование таблиц стилей Qt .Они поддерживают различные свойства, псевдо-состояния и субконтроль, которые позволяют настраивать внешний вид в любой степени.

...