у меня есть QFrame
это используется, чтобы нарисовать некоторые прямоугольники, чтобы представить некоторые периоды дня, например, период, когда пользователь спал.
Для этого я перезаписываю paintEvent(QPaintEvent *)
функция и я использую QPainter
рисовать прямоугольники.
Работает нормально, проблема в том, что paintEvent(QPaintEvent *)
функция автоматически вызывается несколько раз Qt перекрасить QFrame
и это потребляет слишком много ЦПУ. На самом деле, мне просто нужно перекрасить несколько раз (вручную вызывая функцию перерисовки).
Есть какой-то способ, которым я могу избежать QFrame
автоматически перекрасить себя?
заранее спасибо
Я использую Qt 5.3
Виджеты перекрашиваются всякий раз, когда Qt нужно перекрасить их. Вы вообще не можете контролировать это. Вы можете добавлять запросы на перерисовку только при необходимости, но не уменьшать их.
Вы никогда не должны звонить repaint
метод. Вместо этого, всякий раз, когда данные, используемые для рисования, изменяются, вы должны update()
виджет. События обновления слиты для повышения производительности. Призывы к update()
должен быть в методах установки виджета, или должен быть подключен к dataChanged()
и эквивалентные сигналы модели данных, используемые для подачи виджета.
Скорее всего, вы делаете что-то еще не так. Вам нужно будет предоставить отдельный пример, чтобы продемонстрировать проблему.
Я наконец нашел проблему. Я устанавливал таблицу стилей внутри paintEvent
функции, и я думаю, что это перекрашивалось из-за этого
Я делал что-то вроде этого:
MyFrameBar::MyFrameBar(QWidget *parent) : QFrame(parent)
{
color = QColor(50, 50, 50, 200);
}
void MyFrameBar::paintEvent(QPaintEvent *)
{
QString style = "border: 1px solid rgba(%1, %2, %3, %4);";
style = style.arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
setStyleSheet(style);
...
}
Я просто изменил место, где я устанавливал таблицу стилей, и все работает нормально.
Новый код выглядит так:
MyFrameBar::MyFrameBar(QWidget *parent) : QFrame(parent)
{
setColor(QColor(50, 50, 50, 200));
}
void MyFrameBar::paintEvent(QPaintEvent *)
{
...
}
void MyFrameBar::setColor(const QColor &color)
{
this->color = color;
QString style = "border: 1px solid rgba(%1, %2, %3, %4);";
style = style.arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha());
setStyleSheet(style);
}