Мне нужно повернуть определенные элементы пользовательского интерфейса (не все). Я уже пробовал пару вещей, и ни одна из них не предоставила нужного мне решения.
Я попытался использовать QGraphicsProxyWidget и Graphics View, это хорошо работало, если я хотел повернуть весь пользовательский интерфейс, но не давал возможности повернуть только определенные элементы.
Я попытался повысить виджет до пользовательского класса, который переопределяет paintEvent. Я не могу заставить этот способ работать, хотя. Ниже приведен мой текущий код
#include <QPushButton>
#include <QPainter>
#include <QPaintEvent>
class QRotateButton : public QPushButton
{
Q_OBJECT
public:
QRotateButton (QWidget *parent = 0) {}
protected:
void paintEvent(QPaintEvent *event) override {
if (isDrawing)
return QRotateButton::paintEvent(event);
isDrawing = true;
QPixmap buttonPixmap = grab();
QPainter painter(this);
painter.rotate(90);
painter.drawPixmap(0, 0, height(), width(), buttonPixmap);
isDrawing = false;
}
private:
bool isDrawing = false;
};
Это возвращает следующие ошибки
QWidget::repaint: Recursive repaint detected
Segmentation fault
заранее спасибо
Обновить
Следуя комментариям ниже, я изменил код для вызова QPushButton::paintEvent(Event)
вместо QRotateButton::paintEvent(Event)
.
Приложение теперь открывается, чего раньше не было. Но, к сожалению, кнопка не отображается. Всякий раз, когда сейчас вызывается paintEvent, в консоли появляются следующие сообщения об ошибках:
QWidget::repaint: Recursive repaint detected
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::rotate: Painter not active
Recursive repaint detected
- не используйтеQRotateButton::paintEvent(event);
, звонитеQPushButton::paintEvent(event);
. Вы столкнетесь с рекурсией, когдаisDrawing
истинно. Иначе что должен делать этот метод? Почему вы хотите вызывать базовый метод только тогда, когдаisDrawing
истинно? - person Rudolfs Bundulis   schedule 02.08.2017paintEvent
, если вы не передаете ему событие? А также решает ли это исправление вызова базового класса? - person Rudolfs Bundulis   schedule 02.08.2017grab()
создает новое событие из-за того, что требует рисования изображения, чтобы получить его растровое изображение. Но я не уверен, так как это функция QPushButton, а не моя. Я обновил основной вопрос новой проблемой, появившейся после исправления вызова базового класса. Спасибо за помощь - person Alex Spicer   schedule 02.08.2017