Qt Custom виджет с перекрывающимися подвиджетами

0

Я пытаюсь создать собственный виджет в Qt5, который похож на QProgressBar, но с тремя ползунками и движком для пользователя: (слегка сломанная реализация JS: codepen, gist)

Изображение 174551

У меня проблемы с разработкой, как это сделать. Мои попытки не смогли правильно отобразить все части виджета (что очень затрудняет выбор и перемещение разных его частей) или не работает правильно с VBoxLayout (не расширяется, чтобы соответствовать горизонтальному пространству)

Моя последняя попытка (вы должны иметь возможность получить общую идею от конструктора, ничего не было реализовано)

UTrackSlider::UTrackSlider(QWidget *parent) : QWidget(parent)
{
    this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);

    // CIRCLE_HEIGHT = 10
    // BACKGROUND_HEIGHT = 30

    /// @todo css should be in global stylesheet
    background = new QLabel(this);
    background->setMinimumHeight(this->BACKGROUND_HEIGHT);
    background->setStyleSheet("QLabel{ border: 1px solid gray; background-color:white; border-radius:2px}");
    background->setAttribute(Qt::WA_DeleteOnClose);

    cue = new QLabel(this);
    cue->setFixedSize(QSize(this->CIRCLE_HEIGHT, this->CIRCLE_HEIGHT));
    cue->setStyleSheet("QLabel:hover{ border: 2px solid #d9534f; border-radius:5px}");
    cue->setAttribute(Qt::WA_DeleteOnClose);

    duration = new QLabel(this);
    duration->setFixedSize(3, this->BACKGROUND_HEIGHT);
    duration->setStyleSheet("QLabel{border: 3px solid #2376bb} QLabel:hover{border: 5px solid #2376bb}");
    duration->setAttribute(Qt::WA_DeleteOnClose);

    intro = new QLabel(this);
    intro->setFixedSize(QSize(this->CIRCLE_HEIGHT, this->CIRCLE_HEIGHT));
    intro->setStyleSheet("QLabel:hover{ border: 2px solid #5bc85c; border-radius:5px}");
    intro->setAttribute(Qt::WA_DeleteOnClose);

    QGridLayout *mainLayout = new QGridLayout(this);
    mainLayout->addWidget(cue, 5, 0);
    mainLayout->addWidget(background, 0, this->CIRCLE_HEIGHT);
    mainLayout->addWidget(duration, 2, this->CIRCLE_HEIGHT);
    mainLayout->addWidget(intro, 5, this->CIRCLE_HEIGHT + this->BACKGROUND_HEIGHT);
    this->setLayout(mainLayout);
}

В принципе, любые указатели на то, как я должен структурировать этот составной виджет, чтобы он работал во всех этих условиях?

EDIT: обсудив проблему с некоторыми людьми в #qt, я пришел к выводу, что я должен переопределить paintEvent. Но это также означает переопределение некоторых других функций для выполнения эффектов onClick и перетаскивания, и я не знаю, с чего начать

Теги:
qt
qt5
widget
qwidget

1 ответ

1
Лучший ответ

Вы правы, вам нужно повторно внедрить

1.void paintEvent(QPaintEvent *) 
2.void mouseMoveEvent(QMouseEvent *)
3.void mousePressEvent(QMouseEvent *)
4.void mouseReleaseEvent(QMouseEvent *)

QWidget.

Чтобы правильно обработать событие мыши, вы можете использовать QCoreApplication::sendEvent(QObject *, QEvent *) чтобы передать событие целевому виджету.

Вот пример: https://github.com/Serge45/MultiSlider

В этом примере я создаю три виджета (ColorSlider) в виджетах контейнера, а затем использую связанный список для правильного распространения события мыши.

  • 0
    Ого. Ты сделал это только для меня? Так много да! Спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню