Вопрос

Я реализовал маркированный текстовый виджет с помощью Qt4. Я нарисовал текстовое содержимое на Pixmap сначала. А затем покрасьте часть этого pixmap на устройство краски, вызывая Painter.drawtiledPixmap (Offsetx, Offsetety, mypixmap)

Мое воображение в том, что Qt будет заполнить весь прямоугольник текста шарвита с содержимым от mypixmap.

Существует ли когда-либо более быстрый способ, чтобы переместить все существующие контент влево на 1PX и чем заполнить вновь открытую ширину 1 пикселя шириной и N-PX с контентом от MyPixmap?

Это было полезно?

Решение

Хорошо. Это трюк, который я использовал с более медленным оборудованием назад в старые времена. В основном, буфер изображений выделяется в два раза шире, по мере необходимости с 1 дополнительной линией в начале. Создайте изображение слева от буфера. Затем нарисуйте изображение несколько раз с буфером, продвигающимся 1 пикселем одновременно в буфере.

int w = 200;
int h = 100;
int rowBytes = w * sizeof(QRgb) * 2; // line buffer is twice as the width
QByteArray buffer(rowBytes * (h + 1), 0xFF); // 1 more line than the height
uchar * p = (uchar*)buffer.data() + rowBytes; // start drawing the image content at 2nd line
QImage image(p, w, h, rowBytes, QImage::Format_RGB32); // 1st line is used as the padding at the start of scroll
image.fill(qRgb(255, 0, 0)); // well. do something to the image

p = image.bits() - rowBytes / 2; //  start scrolling at the middle of the 1st (blank) line
for(int i=0;i<w;++i, p+=sizeof(QRgb)) {
    QImage  scroll(p, w, h, rowBytes, QImage::Format_RGB32); // scrool 1 pixel at a time
    scroll.save(QString("%1.png").arg(i));
}

Я не уверен, что это будет каким бы быстрее, чем просто изменить смещение изображения и нарисуйте его пролива. Оборудование сегодня действительно мощное, которое оказывает много старых трюков бесполезных. Но весело играть неясные трюки. :)

Другие советы

Привет,

Одной из возможностей для достижения этого будет:

  1. Создайте QGraphicsScene + View и поместите Pixmap на это дважды (как QGraphicsPixmapitem), поэтому они прямо рядом друг с другом.
  2. Размер Вид на соответствие размеру (один) Pixmap.
  3. Затем, вместо того, чтобы перекрасить Pixmap, вы просто переместите просмотр вида просмотра, перемещаясь от одного Pixmap к следующему.
  4. Перепрыгивайте на конец, чтобы создать петлю.

Это может или не может быть быстрее (с точки зрения производительности) - я не проверил его. Но может стоить попробовать, если только ради эксперимента.

Ваш подход, вероятно, является одним из самых быстрых, так как вы используете методы низкого уровня росписи. Вы можете внедрить промежуточный подход между низкой росписью и QGraphicsScene Опция: Использование зоны прокрутки, содержащей метку.

Вот образец кода, который создает новую зону прокрутки, содержащую текстовую метку. Вы можете прокрутить метку автоматически с помощью QTimer Чтобы вызвать эффект прокрутки, который дает вам хороший виджет марки.

QScrollArea *scrollArea = new QScrollArea();

// ensure that scroll bars never show
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

QLabel *label = new QLabel("your scrolling text");

// resize the scroll area : 50px length and an height equals to its content height.
scrollArea->resize(50, label->size().height());
scrollArea->setWidget(label);
label->show(); // optionnal if the scroll area is not yet visible

Текстовая метка внутри зоны прокрутки может быть перемещена слева направо на один пиксель, используя QScrollArea::scrollContentsBy(int dx, int dy) с А. dx Параметр равен -1.

Почему бы просто сделать это на пикселе по пиксельной базе? Из-за того, как кэши работают, написав пиксель до того, как он доберется до конца. Затем вы можете заполнить последний столбец, чтение с другого изображения.

Затем его довольно легко оптимизировать его; Хотя вы начинаете попасть в оптимацию на платформу на данный момент.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top