[英]C++ QT Creator create slot function for QTextEdit::verticalSlideBar?
我正在使用 QT Creator 創建一個簡單的應用程序,每個應用程序旁邊都有兩個 textEdit 字段。 我希望在滾動時將兩個字段鏈接起來,這樣當一個字段向上或向下滾動時,另一個字段也會自動滾動,反之亦然。 為此,我需要一個回調 function,只要用戶移動其中一個字段的滑動條就會觸發該回調。 不幸的是,當我右鍵單擊 textEdit 字段並按“轉到插槽”時,我找不到滑動條移動的事件。
我怎樣才能做到這一點?
QTextEdit
沒有關於其中的滑塊何時更改的信號,因為它不是滾動條。 但是QScrollBar
具有在 slider 移動時發出的sliderMoved(int value)
信號。 QScrollBar
還可以通過槽設置其滾動值(使用setValue(int value)
)
因此,我們可以很容易地使用信號和插槽將兩個滾動條綁定在一起。
例如:
...
// Get easy pointers to the scrollbars
QScrollBar* textbx_slider_1 = ui->textbx1->verticalScrollBar();
QScrollBar* textbx_slider_2 = ui->textbx2->verticalScrollBar();
// Connect them too each other
connect(textbx_slider_1, &QScrollBar::sliderMoved, textbx_slider_2, &QScrollBar::setValue); // Connect the first scrollbar to the second
connect(textbx_slider_2, &QScrollBar::sliderMoved, textbx_slider_1, &QScrollBar::setValue); // Connect the second scrollbar to the first
...
(這假設您的QTextEdit
小部件的 ID 為textbx1
和textbx2
)
編輯:
值得一提的是,在文本框上使用滾輪時不會發出sliderMoved
。 要檢測這些輸入,您必須使用QScrollBar::valueChanged
類的東西。 但是,您必須小心這一點,因為setValue
會發出valueChanged
,這意味着如果您簡單地修改上述代碼,您將獲得無限的反饋循環。
為了防止這種情況,您可以使用 lambda,如下所示:
...
int old_pos = textbx_slider_1->value()
std::function<void(int, QScrollBar*)> f = [old_pos](int new_pos, QScrollBar* slider){
if (new_pos != old_pos) {
// Only trigger if the value has changed
slider->setValue(new_pos);
old_pos = new_pos;
};
connect(textbx_slider_1, &QScrollBar::sliderMoved, std::bind(f, std::placeholders::_1, textbx_slider_2)); // Connect the first scrollbar to the second
connect(textbx_slider_2, &QScrollBar::sliderMoved, std::bind(f, std::placeholders::_1, textbx_slider_1)); // Connect the second scrollbar to the first
...
( std::bind()
的奇怪之處在於我們不會重復幾乎相同的 lambda 兩次)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.