作者checkIO (chec)
看板C_and_CPP
標題[問題] QT QSlider控制問題
時間Fri Dec 2 12:01:17 2016
開發平台(Platform): (Ex: Win10, Linux, ...)
vs 2015
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
qt5.7
問題(Question):
http://imgur.com/2K3zM0Q
我目前用了QSlier
我想請問有沒有辦法寫額外兩個button去控制pageup and down呢(圖片的紅框處)
(因為Slier的捲軸我之後要隱藏它)
我目前的寫法如下,但這樣要自己去算每個widget的間距 非常麻煩
請問有沒有更好的辦法呢
connect(btnArrowRight, SIGNAL(released()), this, SLOT(moveControllerBox()));
//連結button
void myclass::moveControllerBox() {
QPushButton *btn = qobject_cast<QPushButton *>(sender());
QScrollBar *horizontalScrollBar = listWidget->horizontalScrollBar();
int value = listWidget->horizontalScrollBar()->value();
int movePosition = 0;
if (btn->objectName() == "ArrowLeft") {
if (value - 100 < 0) movePosition = 0;
else movePosition = value - 100;
}
else if (btn->objectName() == "ArrowRight") {
if (value + 100 > 1020) movePosition = 1020;
else movePosition = value + 100;
}
horizontalScrollBar->setSliderPosition(movePosition);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.124.46.66
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1480651280.A.561.html
1F:→ uranusjr: 看不太懂你想要怎樣的效果, 可以給個能直接編譯的專案嗎 12/02 12:27
https://www.youtube.com/watch?v=ELvUWf_zN5o&feature=youtu.be
想用上面的ArrowLeft跟ArrowRight button做到跟SliderBar一樣移動的效果
ArrowLeft的要自己去算 每次要移動的間隔 但不想每次都人工去對齊
但有辦法直接取得Slider按下左右移動效果嗎?
https://drive.google.com/file/d/0B7STNBJf-RECaFI4Z3dkU1lOcVE/view?usp=sharing
這邊是專案
2F:→ uranusjr: 所以你想要的是模擬 QScrollBar 那兩個按鈕的功能? 12/02 14:23
3F:→ uranusjr: (順帶一提 QScrollBar 並不是 QSlider, 請不要混用) 12/02 14:23
4F:→ uranusjr: 那個換頁的距離可以直接從 pageStep 裡拿到, 不用自己算 12/02 14:24
5F:→ uranusjr: 詳細請參照 QAbstractSlider 的文件 12/02 14:24
對 因為我想把拉霸隱藏 用按鈕操作
所以取得換頁的距離之後
想使用自制的button去模擬那兩個按鈕的功能還是要自己寫setSliderPosition嗎?
我最後改寫成這樣了 如果有更好的方法麻煩再請指教
void move::moveControllerBox() {
QPushButton *btn = qobject_cast<QPushButton *>(sender());
QScrollBar *horizontalScrollBar = listWidget->horizontalScrollBar();
qDebug()<<"listWidget width: "<<listWidget->width();
int nowScrollValue = listWidget->horizontalScrollBar()->value();
int movePosition = 0;
int singleStep = horizontalScrollBar->singleStep(); //一次跳一格的距離
//int pageStep = horizontalScrollBar->pageStep(); //一次跳整頁的距離
if (btn->objectName() == "ArrowLeft") {
movePosition = nowScrollValue - singleStep;
}
else if (btn->objectName() == "ArrowRight") {
movePosition = nowScrollValue + singleStep;
}
horizontalScrollBar->setSliderPosition(movePosition);
}
※ 編輯: checkIO (210.242.6.98), 12/02/2016 15:05:13
6F:→ uranusjr: 如果你只是要同樣的功能, triggerAction 或許更方便 12/02 15:11
7F:→ uranusjr: 如果內建的 action 不合用那麼這樣就差不多 OK 了 12/02 15:12
8F:→ checkIO: 那請問有內建的函式 可以LOOP嗎 還是要自己寫 12/02 15:58
9F:→ checkIO: 就是如果有 左右切 可以無限循環ITEM 12/02 16:22
10F:→ uranusjr: 是指到最末端再按可以跳回最前端?好像沒有, 只能自己做 12/02 18:22
11F:→ uranusjr: 是說你是想做類似 carousel 的效果嗎?如果是的話其實用 12/02 18:30
12F:→ uranusjr: QStackedLayout + QAnimation 會比較好做... 12/02 18:31
如果是像這個畫面這樣
https://www.youtube.com/watch?v=OJL_484Nct4
假設我有六個item(六張圖) 但我畫面只能容納五個item
0 1 2 3 4 5
初始畫面
0 1 2 3 4
按下向右鍵之後要變成
1 2 3 4 5
再按一次向右
2 3 4 5 0
在按一次向右
3 4 5 0 1 請問這種特效是類似carousel的意思嗎?
感覺QScrollBar做不到?
※ 編輯: checkIO (114.25.217.6), 12/03/2016 19:59:22
13F:→ uranusjr: 是類似沒錯, 這個確實不是 scroll bar 該做的事情... 12/03 20:06
14F:→ uranusjr: 不過 stacked layout(一次只能顯示一個)也不適合 12/03 20:07
15F:→ uranusjr: 大概得自己做動畫了 12/03 20:07
16F:→ checkIO: 請問自己做動畫的意思是? 自己畫框框然後自己移動 12/03 21:24
17F:→ checkIO: WIDGET嗎? 12/03 21:24