Пользовательский виджет QScrollArea неправильно перерисовывается

У меня есть QScrollArea, который содержит мой пользовательский виджет. Когда я изменяю данные пользовательского виджета (который изменяет sizeHint (), и виджет занимает больше места), конец каждой строки и несколько последних строк обрезаются. Я создал небольшую программу, чтобы повторить проблему.

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);

void changeData(const QString &, const unsigned &, const unsigned &);

QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *event) override;

private:
QString lines;
unsigned lineSize = 0, rowSize = 0;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"#include <QApplication>
#include <QtWidgets>

Widget::Widget(QWidget *parent) : QWidget(parent)
{
changeData("TESTING\nFUNCTIO\n1234567\nWORDS77\n", 7, 4);
update();
}

void Widget::changeData(const QString &l, const unsigned &lineSz, const unsigned &rowSz)
{
lines = l;
lineSize = lineSz;
rowSize = rowSz;
}

void Widget::paintEvent(QPaintEvent * /*event*/)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);

QFont defaultFont = painter.font();
QPen defaultPen = painter.pen();
defaultFont.setLetterSpacing(QFont::AbsoluteSpacing, lineSize / 2 - 3);
// set pen and font
painter.setFont(defaultFont);
painter.setPen(defaultPen);
// starting point
QPoint prntPoint(5, 15);

for (QString::size_type ind = 0, row = 1; ind < lines.size(); ++ind)
{
if (lines[ind] != '\n') // if it's a letter
{
// print the letter and move the point to the right
painter.drawText(prntPoint, QString(lines[ind]));
prntPoint.setX(prntPoint.x() + 20);
}
else if (lines[ind] == '\n') // if the character is a newline
{
prntPoint.setX(5); // move point back to the very left
prntPoint.setY(row * 20 + 15); // move down
++row;
}
}
}

QSize Widget::sizeHint() const
{
return QSize(lineSize * 20, rowSize * 20);
}int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Widget *w = new Widget;
QScrollArea area;

area.setWidget(w);
area.show();

//change string and other data variables
w->changeData("1234567890\nQWERTYU123\nLETTERS123\nWORDSSS123\n""TESTING123\nFUNCTIO123\nLETTERS123\nWORDSSS123\n", 10, 8);

return a.exec();
}

Виджет не обновляется должным образом

Как вы можете видеть, данные, которые мы установили в главной функции, обрезаются, печатаются только первые 7 символов и первые 4 строки, в основном берется первая строка, которую мы установили в конструкторе, берется подмножество этой новой строки и печатается.

Без QScrollArea

Удаление QScrollArea устраняет проблему, но мне нужны возможности прокрутки для моего приложения. Любая помощь будет оценена. Спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]