QScrollBar QPlaintextEdit setValue не работает - PullRequest
1 голос
/ 12 февраля 2020

У меня есть простой QPlainTextEdit. В конструкторе MainWindow:

for(int i = 0; i < 100; ++i)
{
    ui->plainTextEdit->appendPlainText("testing");
}

И после этого я хочу прокрутить:

ui->plainTextEdit->verticalScrollBar()->setValue(30);

Но это не работает. Хотя, если бы я создал кнопку и в клик-слоте запустил тот же код, он бы работал:

connect(ui->pushButton, &QPushButton::clicked, this, [this]()
{
    ui->plainTextEdit->verticalScrollBar()->setValue(30); // it works
});

Как это исправить?

1 Ответ

2 голосов
/ 12 февраля 2020

По соображениям эффективности полосы прокрутки обновляются только после отображения виджета, поэтому его необходимо установить через мгновение после выполнения синхронной задачи, и для этого вы можете использовать QTimer::singleShot():

QTimer::singleShot(0, [this](){
    ui->plainTextEdit->verticalScrollBar()->setValue(30);
});

или QMetaObject::invokeMethod():

QMetaObject::invokeMethod(ui->plainTextEdit->verticalScrollBar(), "setValue", Qt::QueuedConnection, Q_ARG(int, 30));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...