簡體   English   中英

C++ QT 創建者為 QTextEdit::verticalSlideBar 創建插槽 function?

[英]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 為textbx1textbx2


編輯:

值得一提的是,在文本框上使用滾輪時不會發出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM