我有一个带垂直滚动条的QTextEdit小部件。
report_text = new QTextEdit();
report_text->setAcceptRichText(true);
report_text->setReadOnly(true);
report_text->setTextInteractionFlags(Qt::NoTextInteraction);
report_text->setAlignment(Qt::AlignTop);
report_text->setWordWrapMode(QTextOption::NoWrap);
report_text->setFrameStyle(QFrame::NoFrame);
report_text->setMinimumSize(600, 380);
report_text->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
这是Qt 4.8嵌入式。
现在我需要一个可以发送到窗口小部件的方法或事件,使其向上或向下滚动,就像按下滚动条上的向上或向下按钮一样。
我尝试了scroll()方法,但是我滚动整个小部件,包括滚动条。
我也试过发送QWheelEvent,但没有任何反应。
QWheelEvent ev(QPoint(), 10, 0, 0);
report_text->setFocus();
QApplication::sendEvent(report_text, &ev);
我错过了什么?
答案 0 :(得分:2)
您提供的delta可能太小了。
来自QWheelEvent::delta()
的{{3}}:
返回车轮旋转的距离,以八分之一为单位 学位。正值表示车轮向前旋转 远离用户;负值表示车轮是 朝向用户向后旋转。
大多数鼠标类型的工作步长为15度,在这种情况下为delta 值是120的倍数;即120个单位* 1/8 = 15度。
以Qt为单位滚动的文本是整行的编号。因此,如果窗口小部件计算出您想要滚动0.9
行,他可能什么都不做。
请再次尝试
QWheelEvent ev(QPoint(), 120, 0, 0);
注意:此处没有任何内容适用于具有控制或移位修饰符的事件。
答案 1 :(得分:1)
以下是我发现的合适解决方案:
可以使用QTextEdit::verticalScrollBar()
方法访问垂直滚动条。
滚动条有一个triggerAction()
方法,可以方便地模拟用户与按钮和滑块的互动。可用的操作在QAbstractSlider
中定义。
因此生成的代码只有一行:
report_text->verticalScrollBar()->triggerAction(QAbstractSlider::SliderSingleStepAdd);
有趣的是,即使用
隐藏滚动条,这仍然有效report_text->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);