2014-11-11 3 views
0

나는 종류의 QProgressBar처럼하지만 3 개 슬라이더와 사용자 이동 함께 Qt5에서 사용자 정의 위젯을 만들려고 노력 해요 : (약간 깨진 JS 구현 : codepen, gist)Qt는 사용자 정의 위젯

저는 이것을 수행하는 방법에 대한 문제가 있습니다. 내 시도가 위젯의 모든 부분을 올바르게 렌더링하지 못 했으므로 (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를 재정의해야한다는 결론에 도달했습니다. 그러나이 또한 온 클릭과 드래그 효과를해야 할 몇 가지 다른 기능을 무시 의미, 그리고 당신은, 당신이는 QWidget의

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

를 다시 구현하는 권리가있는

답변

1

을 시작합니다 어디 아이디어가있어 .

마우스 이벤트를 올바르게 처리하려면 QCoreApplication::sendEvent(QObject *, QEvent *)을 사용하여 이벤트를 대상 위젯에 전달할 수 있습니다.

여기 예입니다 :이 예에서 https://github.com/Serge45/MultiSlider

, I는 컨테이너 위젯의 세 가지 위젯 (ColorSlider)을 만든 다음 제대로 마우스 이벤트를 전달하는 연결리스트를 사용합니다.

+0

와우. 너 나를 위해 이걸 만들었 니? 너무 많은 예! 정말 고마워 :) – LordAro