2015-08-05 11 views
1

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

  1. Изменить все цвета так, как я хочу, манипулируя указателей для графических объектов
  2. захватить скриншот с помощью QWidget :: грейфер(), чтобы получить 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.

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

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

Я также попытался с ui->plot->update() вместо этого.

+0

Вы пытались использовать ['QCustomPlot :: savePng'] (http://www.qcustomplot.com/documentation/classQCustomPlot.html#a7636261aff1f6d25c9da749ece3fc8b8)? Я не знаю, как это работает на внутреннем уровне, но, похоже, перерисовывает все, поэтому вам даже не нужно будет вызывать 'QApplication :: processEvents'. Стоит сделать снимок. – thuga

ответ

0

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

0

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

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

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

+0

'redraw' insted' update' –

+0

Я предполагаю, что вы имеете в виду 'repaint' вместо' redraw' :-) Пожалуйста, взгляните на обновление 1, я включил часть контента из toggleColors. –

+0

SaZ, я не вижу документацию о функции redraw(), а не в QT4 или QT5. Возможно, вы имели в виду repaint(), что (я согласен) также может быть решением. – macetw