Qt Custom widget с припокриващи се подизпълнители

Опитвам се да направя персонализирана джаджа в Qt5, която е нещо като QProgressBar, но с 3 плъзгача и преместваема от потребителя: (леко нарушена JS реализация: codepen, същност)

Имам проблеми да разбера как да направя това. Опитите ми не успяха или да изобразят правилно всички части на приспособлението (което прави много трудно избирането и преместването на различни части от него), или не работят правилно с 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);
}

По принцип, някакви указания за това как трябва да структурирам тази съставна джаджа, така че да работи при всички тези условия?

РЕДАКТИРАНЕ: След като обсъдих проблема с някои хора на #qt, стигнах до заключението, че трябва да отменя paintEvent. Но това също означава замяна на някои други функции за извършване на ефектите onClick и плъзгане и нямам представа откъде да започна


person LordAro    schedule 11.11.2014    source източник


Отговори (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) в приспособление за контейнер и след това използвам свързан списък, за да разпространявам правилно събитието на мишката.

person Serge    schedule 12.11.2014
comment
уау Направи ли това само за мен? Толкова много да! Много благодаря :) - person LordAro; 12.11.2014