Я пытаюсь создать собственный виджет в Qt5, который похож на QProgressBar, но с тремя ползунками и движком для пользователя: (слегка сломанная реализация JS: codepen, gist)
У меня проблемы с разработкой, как это сделать. Мои попытки не смогли правильно отобразить все части виджета (что очень затрудняет выбор и перемещение разных его частей) или не работает правильно с 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 и перетаскивания, и я не знаю, с чего начать
Вы правы, вам нужно повторно внедрить
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) в виджетах контейнера, а затем использую связанный список для правильного распространения события мыши.