日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Qt工作笔记-3D效果唤出QWidgets界面(QGraphicsProxyWidget与QTimeLine)

發布時間:2025/3/15 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt工作笔记-3D效果唤出QWidgets界面(QGraphicsProxyWidget与QTimeLine) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序運行截圖如下:

?

關鍵點一:

->:這個箭頭表示左邊的類是放到右邊的類里面的

QWidget->QGraphicsProxyWidget

QGraphicsProxyWidget->QGraphicsScene

QGraphicsScene->QGraphicsView

本程序中在Ui中QGraphicsView是放入在QWIdget中的

關于QGraphicsProxyWidget的筆記請看:

https://blog.csdn.net/qq78442761/article/details/81507130

?

關鍵點二:

QTimeLine是Qt的時間線函數,線有兩端,所以有2個方向,一般都使用QTimeLine實現這種生動的旋轉。

?

源碼如下:

mycustomproxy.h

#ifndef MYCUSTOMPROXY_H #define MYCUSTOMPROXY_H#include <QGraphicsProxyWidget> #include <QTimeLine>QT_BEGIN_NAMESPACE class QGraphicsSceneHoverEvent; QT_END_NAMESPACEclass MyCustomProxy : public QGraphicsProxyWidget {Q_OBJECT public:explicit MyCustomProxy(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);~MyCustomProxy();protected:void hoverEnterEvent(QGraphicsSceneHoverEvent *event) Q_DECL_OVERRIDE;void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) Q_DECL_OVERRIDE;protected slots:void updateStep(int step);void finished();private:QTimeLine *m_timeLine;qreal m_currAngle; };#endif // MYCUSTOMPROXY_H

widget.h

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE class QGraphicsScene; QT_END_NAMESPACEnamespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;QGraphicsScene *m_scene; };#endif // WIDGET_H

widgetwindow.h

#ifndef WIDGETWINDOW_H #define WIDGETWINDOW_H#include <QWidget>namespace Ui { class WidgetWindow; }class WidgetWindow : public QWidget {Q_OBJECTpublic:explicit WidgetWindow(QWidget *parent = 0);~WidgetWindow();protected slots:void btnClicked();private:Ui::WidgetWindow *ui; };#endif // WIDGETWINDOW_H

main.cpp

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

mycustomproxy.cpp

#include "mycustomproxy.h" #include <QDebug> #include <QGraphicsScene> #include <QTransform>MyCustomProxy::MyCustomProxy(QGraphicsItem *parent, Qt::WindowFlags wFlags): QGraphicsProxyWidget(parent,wFlags) {QTransform transform;setTransform(transform.rotate(-60,Qt::YAxis));m_currAngle=0;m_timeLine=new QTimeLine;m_timeLine->setFrameRange(-60,0);connect(m_timeLine,SIGNAL(frameChanged(int)),this,SLOT(updateStep(int)));connect(m_timeLine,SIGNAL(finished()),this,SLOT(finished())); }MyCustomProxy::~MyCustomProxy() {}void MyCustomProxy::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {scene()->setActiveWindow(this);m_timeLine->setDirection(QTimeLine::Forward);if(m_timeLine->state()!=QTimeLine::Running)m_timeLine->start();QGraphicsProxyWidget::hoverEnterEvent(event); }void MyCustomProxy::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) {m_timeLine->setDirection(QTimeLine::Backward);if(m_timeLine->state()!=QTimeLine::Running)m_timeLine->start();QGraphicsProxyWidget::hoverLeaveEvent(event); }void MyCustomProxy::updateStep(int step) {//qDebug()<<"step:"<<step;QTransform transform;setTransform(transform.rotate(step,Qt::YAxis)); }void MyCustomProxy::finished() {//qDebug()<<"finished!"; }

widget.cpp

#include "widget.h" #include "ui_widget.h" #include "widgetwindow.h" #include "mycustomproxy.h" #include <QGraphicsScene> #include <QDebug> #include <QTransform>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);ui->graphicsView->setStyleSheet("background: transparent;border:0px");ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);ui->graphicsView->setRenderHints(ui->graphicsView->renderHints()|QPainter::Antialiasing|QPainter::SmoothPixmapTransform);setWindowFlags(Qt::Window|Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);m_scene=new QGraphicsScene;ui->graphicsView->setScene(m_scene);MyCustomProxy *myCustomProxy_1=new MyCustomProxy;myCustomProxy_1->setWidget(new WidgetWindow);myCustomProxy_1->setWindowFlags(Qt::Desktop);myCustomProxy_1->setWindowTitle("QWidget demo 中文");myCustomProxy_1->setPos(-300,0);MyCustomProxy *myCustomProxy_2=new MyCustomProxy;myCustomProxy_2->setWidget(new WidgetWindow);myCustomProxy_2->setWindowFlags(Qt::Desktop);myCustomProxy_2->setWindowTitle("QWidget demo 中文");myCustomProxy_2->setPos(-150,0);MyCustomProxy *myCustomProxy_3=new MyCustomProxy;myCustomProxy_3->setWidget(new WidgetWindow);myCustomProxy_3->setWindowFlags(Qt::Desktop);myCustomProxy_3->setWindowTitle("QWidget demo 中文");myCustomProxy_3->setPos(0,0);MyCustomProxy *myCustomProxy_4=new MyCustomProxy;myCustomProxy_4->setWidget(new WidgetWindow);myCustomProxy_4->setWindowFlags(Qt::Desktop);myCustomProxy_4->setWindowTitle("QWidget demo 中文");myCustomProxy_4->setPos(150,0);MyCustomProxy *myCustomProxy_5=new MyCustomProxy;myCustomProxy_5->setWidget(new WidgetWindow);myCustomProxy_5->setWindowFlags(Qt::Desktop);myCustomProxy_5->setWindowTitle("QWidget demo 中文");myCustomProxy_5->setPos(300,0);m_scene->addItem(myCustomProxy_1);m_scene->addItem(myCustomProxy_2);m_scene->addItem(myCustomProxy_3);m_scene->addItem(myCustomProxy_4);m_scene->addItem(myCustomProxy_5);ui->graphicsView->setSceneRect(-404.027,-40.2044,939.058,402.725);ui->graphicsView->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); }Widget::~Widget() {delete ui; }

widgetwindow.cpp

#include "widgetwindow.h" #include "ui_widgetwindow.h" #include <QMessageBox>WidgetWindow::WidgetWindow(QWidget *parent) :QWidget(parent),ui(new Ui::WidgetWindow) {ui->setupUi(this);connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked())); }WidgetWindow::~WidgetWindow() {delete ui; }void WidgetWindow::btnClicked() {QMessageBox::information(this,"提示","按鈕被按下了!"); }

?

總結

以上是生活随笔為你收集整理的Qt工作笔记-3D效果唤出QWidgets界面(QGraphicsProxyWidget与QTimeLine)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。