Создание подкласса QLabel в Qt Creator с использованием C ++ - PullRequest
0 голосов
/ 11 сентября 2018

Я недавно новичок в мире c ++.Мой опыт работы в основном с Python и некоторыми языками сценариев для конкретных приложений.В любом случае, я хотел получить некоторую общую обратную связь и преобразовать свой подкласс QLabel, написанный на pyside, и преобразовать его для работы с приложением C ++ в Qt Creator.Я не ищу кого-то, кто сделает весь проект для меня.Мне просто нужно несколько советов о том, как добавить / настроить пользовательский элемент управления в моем проекте Qt.

Вы заметите, что в моем подклассе я просто переписал событие рисования метки, чтобы создать пунктиршаблон для заполнения пустого пространства справа от метки, как показано здесь:

enter image description here

Код для моей пользовательской метки в Pyside:

class QLabelHeader(QtWidgets.QLabel):

    def __init__(self, parent=None, **kwargs):
        super(QLabelHeader, self).__init__(parent)   

    # events
    def paintEvent(self, event):
        # calculate font width
        metrics = QtGui.QFontMetrics(self.font())
        text_width = metrics.boundingRect(self.text()).width()

        # calculate dimensions
        y = int(self.height() * 0.5 - 2)
        x = text_width + 4
        width = self.width() - x

        # create pattern
        px = QtGui.QPixmap(4,4)
        px.fill(QtCore.Qt.transparent)
        pattern_painter = QtGui.QPainter(px)
        pattern_painter.setPen(QtGui.QPen(QtCore.Qt.NoPen))
        pattern_painter.setBrush(QtGui.QBrush(QtGui.QColor(200,200,200), QtCore.Qt.SolidPattern))
        pattern_painter.drawRect(0,0,1,1)
        pattern_painter.drawRect(2,2,1,1)
        pattern_painter.end()

        # draw tiled pixmap
        painter = QtGui.QPainter(self)
        painter.drawTiledPixmap(x,y,width,5,px) 
        painter.end()

        super(QLabelHeader, self).paintEvent(event)

Вопрос:

  1. Я видел другие примеры проектов в Интернете, которые включают настраиваемые элементы управления со структурой папок, как показано здесь, которая является подпапкой в ​​более крупном проекте.Как они создают эту структуру папок и ее набор файлов?

  2. В качестве дополнительного бонуса, если кто-то захочет показать мне код предварительного просмотра / псевдо-кода того, как будут выглядеть мои файлы h и cpp для переопределения события рисования QLabel, такого как мой код pyside.

enter image description here

1 Ответ

0 голосов
/ 11 сентября 2018

Решение

  1. Добавьте новый класс в ваш проект в Qt creator, перейдя в Файл-> Новый файл или Проект-> C ++ -> C ++ Class . Заставьте класс наследоваться от QWidget из выпадающего меню. Выберите подпапку и присвойте классу имя

Примечание: Совет: не называйте свои классы префиксом Q , так как это может привести к путанице.

  1. В заголовке заменить базовый класс и включить с помощью QLabel
  2. Щелкните правой кнопкой мыши имя базового класса и выберите Refactor-> Вставить виртуальные функции базовых классов и добавьте paintEvent
  3. Щелкните правой кнопкой мыши paintEvent и выберите Refactor-> Add Definition in xxx.cpp
  4. Перейдите к определению и вставьте туда свой код

Перевод должен быть довольно простым, если вы знаете синтаксис обоих языков.

Пример * * одна тысяча тридцать шесть Чтобы помочь вам в этом процессе, я подготовил пример того, как ваш код может быть переведен на C ++: LabelHeader.h #ifndef LABELHEADER_H #define LABELHEADER_H #include <QLabel> class LabelHeader : public QLabel { Q_OBJECT public: explicit LabelHeader(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; }; #endif // LABELHEADER_H LabelHeader.cpp #include "LabelHeader.h" #include <QPainter> LabelHeader::LabelHeader(QWidget *parent) : QLabel(parent) { } void LabelHeader::paintEvent(QPaintEvent *event) { // calculate font width QFontMetrics metrics(font()); int text_width = metrics.boundingRect(text()).width(); // calculate dimensions int y = height() * 0.5 - 2; int x = text_width + 4; int w = width() - x; // create pattern QPixmap px(4, 4); px.fill(Qt::transparent); QPainter pattern_painter(&px); pattern_painter.setPen(Qt::NoPen); pattern_painter.setBrush(QBrush(QColor(200, 200, 200), Qt::SolidPattern)); pattern_painter.drawRect(0, 0, 1, 1); pattern_painter.drawRect(2, 2, 1, 1); // pattern_painter.end(); // draw tiled pixmap QPainter painter(this); painter.drawTiledPixmap(x, y, w, 5, px); // painter.end(); QLabel::paintEvent(event); } Примечание: Я также позволил себе пересмотреть код после его перевода и пропустить или прокомментировать части, которые не нужны. Полный код примера доступен на GitHub . Результат

При использовании в представленном примере приложения этот класс дает аналогичный результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...