QApplication::processEvents не работает в Windows

Я работаю над проектом, который представляет данные в реальном времени, полученные в режиме реального времени с помощью подключаемого модуля QCustomPlot для Qt. Дисплей имеет черный цвет фона, а несколько каналов данных окрашены по-разному. Делая снимок экрана, мы хотели бы сделать его удобным для печати, чтобы фон был белым, а все данные — черными. Я думаю о таком решении:

  1. Измените все цвета так, как я хочу, манипулируя указателями графических объектов.
  2. Сделайте снимок экрана с помощью QWidget::grab(), чтобы получить QPixmap
  3. Измените все цвета на нормальные

Сначала это не сработало, потому что система не могла вовремя изменить цвета для того, чтобы сделать снимок экрана. Поэтому я использовал QApplication::processEvents(), и все это работало на моем Mac.

Однако он не работает на Windows 7 (что требуется). Есть идеи, что делать?

Код:

QSting fileLocation = "...";
toggleColors(false); //function to toggle the colors
QApplication::processEvents();
QPixmap shot = grab();
toggleColors(true);
shot.save(fileLocation, "png");

Опять таки. Он работает на Mac, но не на Windows.

Обновление 1. Содержимое toggleColors включает:

  if(enable)
    ui->plot->setBackground(QBrush(Qt::black));
  else
    ui->plot->setBackground(QBrush(Qt::white));
  ui->plot->repaint();

Я также пробовал вместо этого использовать ui->plot->update().


person casparjespersen    schedule 05.08.2015    source источник
comment
Пробовали ли вы использовать QCustomPlot::savePng? Я не знаю, как это на самом деле работает внутри, но кажется, что он перерисовывает все, поэтому вам может даже не понадобиться вызывать QApplication::processEvents. Стоит попробовать.   -  person thuga    schedule 05.08.2015


Ответы (2)


Я не уверен, в чем конкретно проблема в Windows, но я рекомендую вам вызывать QWidget::update() для данного виджета. Это заставляет следующее обновление повторно отображать себя.

С другой стороны, я не уверен, почему toggleColors() каким-то образом не вызвал этого.

Кроме того, убедитесь, что для QWidget::setUpdatesEnabled(bool) не установлено значение «false».

person macetw    schedule 05.08.2015
comment
Я предполагаю, что вы имеете в виду repaint вместо redraw :-) Пожалуйста, взгляните на обновление 1, я включил часть контента из toggleColors. - person casparjespersen; 05.08.2015
comment
SaZ, я не вижу документации по функции redraw(), ни в QT4, ни в QT5. Возможно, вы имели в виду repaint(), что (я согласен) также может быть решением. - person macetw; 05.08.2015
comment
Подумайте также об использовании QWidget::render(), чтобы получить то, что вы ищете. Обратите внимание, что ваш QPaintDevice*, на который вы визуализируете, является созданным вами QPixmap. - person macetw; 05.08.2015
comment
Похоже, проблема связана с QCustomPlot. Это было решено путем выполнения ui->plot->replot(), специфичного для QCustomPlot, а не для QWidget. - person casparjespersen; 05.08.2015
comment
Конечно, я имею в виду repaint. В любом случае, этого делать не нужно, потому что метод grab будет вызывать paintEvent напрямую. - person Dmitry Sazonov; 05.08.2015

Похоже, проблема заключается в QCustomPlot. Это было решено путем выполнения ui->plot->replot(), относящегося к QCustomPlot, а не QWidget.

person casparjespersen    schedule 05.08.2015