2013-07-02 21 views
0

我正在做一個繪圖表面的軟件,它代表一個繪圖(像一個sin函數)(QWidget的一個孩子),我希望QScrollBar的行爲像一個QScrollArea。因此,如果我的繪圖小部件顯示顯示750點(我的繪圖由點組成),但有1000個點,我希望ScrollBar的滑塊填滿可用空間的75%。QScrollBar的設置滑塊大小與內容對應

我無法使用QScrollArea,因爲滾動與包含的窗口小部件的大小成比例。在我的情況下,滾動必須與屏幕上的點數成比例。我知道如何得到我的比例,但我不知道如何正確設置QScrollBar

例如:我編輯了PageStep的值,但我不明白這是如何工作的。我可以將pageStep設置爲100,範圍爲[0,99],它將填充QScrollBar的一半。

我的界面:

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

爲什麼你不能用'QScrollArea'目前還不清楚。 「滾動與它包含的小部件的大小成正比」 - 這是什麼意思?請舉一些例子,可能是圖片。 –

+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萬個像素)。因此完全重繪或內存分配不會發生。你只需要保持你的paintEvent快。

+0

我沒有任何paintEvent(已經完成)的問題,但sizeHint不會改變任何東西。我的ScrollBar被禁用。如果我將「Widget resizable」設置爲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/1024 ----------> PageStep = 768

1024 = MAX + 768 ---------------->最大= 256

你可以在你的軟件中試試它,它會起作用。我知道沒有那麼多人需要重現這一點,因爲大多數情況下QScrollArea都會完成這項工作。

例如,這個代碼是在一個槽從resize事件反應:

ui.sbarRange->setPageStep(u64SampleCount * dRatio); 
ui.sbarRange->setMaximum(u64SampleCount - ui.sbarRange->pageStep());