Я хотел бы повернуть виджет вокруг своей оси Y (или любой оси) в QT точно так же, как показано здесь:
Поворот изображения в трехмерном пространстве вокруг оси Y
Я искал, но все, что я получил 2d преобразование, как вращение по часовой стрелке или против часовой стрелки
Я действительно хочу что-то очень простое, потому что я сделаю это один раз во всем проекте.
Во-первых, обычный виджет Qt не может сделать это из-за того, как работает механизм рисования (он полностью двумерный), и как работают менеджеры компоновки, поэтому любое решение нетривиально.
Самый простой способ сделать это, чтобы поместить виджет в QGraphicsScene/View
как QGraphicsProxyWidget
и использовать setTransform(const QTransform&, bool)
метод применения матрицы преобразования.
Однако, поскольку движок все еще 2D, вам придется создать матрицу трехмерного преобразования, описывающую нужную вам операцию, а затем использовать проекцию для преобразования в двумерную матрицу. Это не просто, но вы можете «подделать» эффект, подобный тому, к которому вы привязались, используя статический метод squareToQuad(const QPolygonF&, QTransform&)
— по мере того, как пользователь «поворачивает» виджет, один вертикальный край становится меньше и перемещается к центру квадрата, тогда как противоположный край становится больше и движется к центру квадрата.
Проще всего сделать и понять, нарисовать виджет в QPixmap. Затем подкласс QWidget рисует этот QPixmap, преобразованный для соответствия трехмерному вращению или «поддельному» вращению. Поскольку эта картина аккуратно находится внутри одиночного paintEvent () в вашем пользовательском виджете, легко начать с поддельной версии (например, без перспективы), а затем вернуться к ней и улучшить ее, если есть время и необходимость.
Например, было бы довольно легко сделать рисование с использованием OpenGL, например, на основе «Текстура» пример в openGL примеры Qt.
Если вы действительно хотите выполнить это в проекте Qt таким образом, который бы хорошо интегрировался с другими виджетами пользовательского интерфейса, я бы порекомендовал проверить Qt Quick (Qt 4.7+) или Qt Quick 2.0 (Qt 5.0 +). Они специально предназначены для облегчения создания более динамичных интерфейсов. Они используют QML (css-подобный язык разметки, который описывает функциональность виджетов) в сочетании со знакомой оболочкой C ++ более высокого уровня, к которой можно получить доступ, как и к любому другому виджету Qt. Qt Quick 2.0 особенно хорош, будучи в состоянии относительно легко рисовать эффекты системы частиц.