为什么QPlainTextEdit内容滚动后不触发scrollContentsBy
时间: 2023-11-22 20:53:14 浏览: 32
QPlainTextEdit继承自QAbstractScrollArea,而scrollContentsBy是QAbstractScrollArea的保护函数,用于在滚动区域内容时更新视图。但是,它只有在滚动区域的滚动条被拖动时才会触发。如果你想在滚动区域内容滚动时触发scrollContentsBy函数,可以通过重载QPlainTextEdit的scrollContentsBy函数并调用viewport()来实现:
```python
class MyPlainTextEdit(QPlainTextEdit):
def __init__(self, parent=None):
super(MyPlainTextEdit, self).__init__(parent)
def scrollContentsBy(self, dx, dy):
super(MyPlainTextEdit, self).scrollContentsBy(dx, dy)
self.viewport().update()
```
这里重载了scrollContentsBy函数,在调用父类函数后,手动调用viewport()的update()函数,从而触发更新视图。
相关问题
为什么QPlainTextEdit光标移动导致滚动条移动时,不会触发valueChanged信号
QPlainTextEdit控件的valueChanged信号是在文本内容发生改变时触发的,而不是在滚动条位置发生改变时触发的。因此,当光标移动导致滚动条移动时,不会触发valueChanged信号。
如果您需要在滚动条位置发生改变时触发信号,可以使用QScrollBar的valueChanged信号。您可以通过以下代码获取QPlainTextEdit的水平和垂直滚动条对象,并连接它们的valueChanged信号:
```python
# 获取水平滚动条对象
h_scrollbar = plain_text_edit.horizontalScrollBar()
# 获取垂直滚动条对象
v_scrollbar = plain_text_edit.verticalScrollBar()
# 连接滚动条的valueChanged信号到自定义槽函数
h_scrollbar.valueChanged.connect(self.on_scrollbar_value_changed)
v_scrollbar.valueChanged.connect(self.on_scrollbar_value_changed)
# 自定义槽函数
def on_scrollbar_value_changed(self, value):
# 滚动条位置发生改变时执行的操作
pass
```
为什么QPlainTextEdit光标移动导致滚动条移动时,不会触发滚动条的valueChanged信号
在Qt中,QPlainTextEdit控件的滚动条是由QScrollBar控件实现的。当你移动光标时,QPlainTextEdit控件会自动滚动文本内容,从而导致滚动条的位置发生了变化,但是这种变化并不会触发滚动条的valueChanged信号。
如果你想在光标移动时也能够触发滚动条的valueChanged信号,可以重写QPlainTextEdit的scrollContentsBy()函数。这个函数会在控件滚动时被调用,你可以在这个函数中手动发射valueChanged信号,从而达到你想要的效果。
以下是一个示例代码:
```cpp
class MyPlainTextEdit : public QPlainTextEdit
{
public:
MyPlainTextEdit(QWidget *parent = nullptr) : QPlainTextEdit(parent) {}
protected:
void scrollContentsBy(int dx, int dy) override
{
QPlainTextEdit::scrollContentsBy(dx, dy);
QScrollBar *sb = verticalScrollBar();
if (sb)
emit sb->valueChanged(sb->value());
}
};
```
这个示例代码中,我们重写了QPlainTextEdit的scrollContentsBy()函数,在调用基类函数之后,手动发射了滚动条的valueChanged信号。这样,无论是鼠标滚轮滚动还是光标移动,都会触发滚动条的valueChanged信号。