2013-07-02 1 views
0

음모 함수 (예 : QWidget의 자식)를 나타내는 그리기 화면이있는 소프트웨어를 사용하고 QScrollArea와 같은 QScrollBar를 사용하고 싶습니다. 따라서 드로잉 위젯 쇼에 750 도트 (점으로 이루어짐)가 표시되지만 1000 도트가있는 경우 ScrollBar의 슬라이더에 사용 가능한 공간의 75 %를 채우고 싶습니다.내용과 일치하는 QScrollBar의 슬라이더 크기 설정

스크롤이 포함 된 위젯의 크기에 비례하기 때문에 QScrollArea를 사용할 수 없습니다. 필자의 경우 스크롤은 스크린의 점 수에 비례해야합니다. 내 비율을 얻는 방법을 알고 있지만 QScrollBar을 올바르게 설정하는 방법을 모르겠습니다.

예 : PageStep의 값을 편집했지만 어떻게 작동하는지 이해할 수 없습니다. [0,99] 범위에서 pageStep을 100으로 설정할 수 있으며 QScrollBar의 절반을 채울 것입니다.

내 인터페이스 :

QWidget (Vertical Layout) //Main Widget 
    Drawing Surface (Child of QWidget) 
    QScrollBar (Horizontal) 
+0

그것은 불분명하다. "스크롤은 포함 된 위젯의 크기에 비례합니다."- 무슨 의미입니까? 제발 몇 가지 예를 들어, 그림이 될 수 있습니다. –

+0

죄송합니다.이 링크 (http://harmattan-dev.nokia.com/docs/library/html/qt4/widgets-imageviewer.html)에서 볼 수 있듯이 가운데 그림이 보이면 너무 크고 사진의 80 % 만 표시됩니다. 가로 스크롤 막대는 80 %를 나타내는 크기입니다. 그러나 제 경우에는 비율이 그림의 크기가 아니라 소프트웨어가 제공하는 다른 값의 비율입니다. – Nic007

+0

모든 1000 도트를 포함하는 위젯을 작성하고이 위젯을 스크롤 영역에 넣으십시오. 스크롤바는 자동으로 관리됩니다. 아니면 점들이 너무 많아 효율성에 대해 걱정하고 있습니까? –

답변

1

당신은 새로운는 QWidget 서브 클래스를 생성하고 sizeHintpaintEvent을 구현할 수 있습니다. paintEvent에서 event->rect()을 사용하여 현재 노출되어 있고 그려야하는 영역을 확인할 수 있습니다. 창을 동결하지 않으려면 paintEvent이 빠르다는 점에 유의하십시오. 또한 만들어진 위젯을 QScrollArea에 넣어야합니다.

class SinWidget : public QWidget { 
public: 
    QSize sizeHint() const { 
    return QSize(10000, 200); 
    } 

    void paintEvent(QPaintEvent* event) { 
    QPainter painter(this); 
    for(int x = event->rect().left(); x <= event->rect().right(); x++) { 
     painter.drawPoint(x, 100.0 + qSin(0.05 * x) * 20.0); 
    } 
    } 
}; 

QScrollArea area; 
area.setWidget(new SinWidget()); 
area.show(); 

예는 매우 큰 위젯 크기 (예를 들어 100,000 픽셀)로 잘 작동 :

여기 정현파를 그리는 간단한 예이다. 따라서 전체 페인트 또는 메모리 할당이 발생하지 않습니다. paintEvent 만 빨리 처리하면됩니다.

+0

paintEvent에 문제가 없습니다 (이미 완료되었습니다). sizeHint는 아무것도 변경하지 않습니다. 내 ScrollBar가 비활성화되었습니다. "위젯 크기 재조정"을 false (기본 크기는 400x300)로 설정하고 위젯 크기 아래의 대화 상자를 축소하면 스크롤 막대가 표시됩니다. – Nic007

+0

내용 길이가 뷰포트 길이보다 큰 경우 기본적으로 스크롤 막대가 표시됩니다. 대신에 무엇을하고 싶니? –

+0

나는 이런 식으로하고 싶지만 크기는 크기가 아니라 점들과 반응하도록하고 싶습니다. 나는 QScrollArea와 같은 것을하고 싶지만 정확히 같은 것은 아니다. – Nic007

2

글쎄, 내가이 뭔가를 할 수라고 생각 :

http://harmattan-dev.nokia.com/docs/library/html/qt4/qscrollbar.html

enter image description here

문서 길이 사이의 관계, 스크롤 막대에 사용되는 값의 범위, 페이지 단계는 많은 일반적인 상황에서 간단합니다. 스크롤 막대의 값 범위는 문서의 길이를 나타내는 값에서 선택된 페이지 단계를 뺀 값으로 결정됩니다. 이 경우 다음 방정식이 유용합니다. document length = maximum() - minimum() + pageStep().

그래서 제 경우에는 길이가 점의 수이고 minimum()을 0으로 설정할 수 있습니다. 그림에서 볼 수 있듯이 QScrollArea와 같은 것을 할 수 있습니다. 비율은 PercentageVisible = PageStep/Length이고 다른 수식은 Length = PageStep + Max입니다.

두 개의 방정식, 두 개의 누락 값 (PageStep 및 Maximum) 및 두 개의 알려진 값 (PercentageVisible 및 Length)이 있습니다.

예 : 1024 도트가 있지만 75 % 만 표시됩니다.

0.75 = PageStep/1,024 ----------> PageStep = 768

+ 1,024 = 최대 768 ----------------> 최대 = 256

당신의 소프트웨어에서 시도해 볼 수 있습니다.QScrollArea가 대부분의 경우에 작업을 수행 할 것이기 때문에 이것을 재현해야 할 사람이별로 없다는 것을 알고 있습니다. 예를함으로써

,이 코드는 resize 이벤트에서 반응 슬롯에 ​​: 당신은`QScrollArea`를 사용할 수없는 이유

ui.sbarRange->setPageStep(u64SampleCount * dRatio); 
ui.sbarRange->setMaximum(u64SampleCount - ui.sbarRange->pageStep()); 
관련 문제