QT实现窗口缩放打开与关闭(重叠窗口,太有意思了)
2016-06-10 22:51
891 查看
基本思想:假设A为主窗口,B为子窗口。A打开或关闭时,先对A窗口进行截图,然后将图片部满整个B窗口的,在paintEvent里面进行动态缩放或放大画图。最后使用动画,将B窗口以动画的形式打开或关闭,动画播放完毕后,B发送一个信号给A,B关闭,A显示出来。
核心代码发下:
在A窗口里:
QPixmap pixmap;
CTestDialog dlg(this);
dlg.SetPixmap(pixmap.grabWidget(this));
hide();
dlg.exec();
B窗口:
CTestDialog::CTestDialog(QWidget *pParent) : QDialog(pParent)
{
ui.setupUi(this);
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
}
CTestDialog::~CTestDialog()
{
}
void CTestDialog::SetPixmap(const QPixmap &pixmap)
{
m_backPixmap = pixmap;
m_image = pixmap.toImage();
update();
QDesktopWidget *desktopWidget = QApplication::desktop();
QRect screenRect = desktopWidget->screenGeometry();
QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
animation->setDuration(2200);
animation->setEasingCurve(QEasingCurve::OutBounce);
animation->setStartValue(QRect((screenRect.width() - 50) / 2, (screenRect.height() - 50) / 2, 50, 50));
animation->setEndValue(QRect((screenRect.width() - 500) / 2, (screenRect.height() - 400) / 2, 500, 400));
animation->start();
}
void CTestDialog::paintEvent(QPaintEvent *p)
{
QPalette pal(palette());
pal.setBrush(QPalette::Window, QBrush(m_image.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
setPalette(pal);
}
http://blog.csdn.net/itjobtxq/article/details/9663757
核心代码发下:
在A窗口里:
QPixmap pixmap;
CTestDialog dlg(this);
dlg.SetPixmap(pixmap.grabWidget(this));
hide();
dlg.exec();
B窗口:
CTestDialog::CTestDialog(QWidget *pParent) : QDialog(pParent)
{
ui.setupUi(this);
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
}
CTestDialog::~CTestDialog()
{
}
void CTestDialog::SetPixmap(const QPixmap &pixmap)
{
m_backPixmap = pixmap;
m_image = pixmap.toImage();
update();
QDesktopWidget *desktopWidget = QApplication::desktop();
QRect screenRect = desktopWidget->screenGeometry();
QPropertyAnimation *animation = new QPropertyAnimation(this, "geometry");
animation->setDuration(2200);
animation->setEasingCurve(QEasingCurve::OutBounce);
animation->setStartValue(QRect((screenRect.width() - 50) / 2, (screenRect.height() - 50) / 2, 50, 50));
animation->setEndValue(QRect((screenRect.width() - 500) / 2, (screenRect.height() - 400) / 2, 500, 400));
animation->start();
}
void CTestDialog::paintEvent(QPaintEvent *p)
{
QPalette pal(palette());
pal.setBrush(QPalette::Window, QBrush(m_image.scaled(this->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation)));
setPalette(pal);
}
http://blog.csdn.net/itjobtxq/article/details/9663757
相关文章推荐
- QT动画介绍(有例子可以下载)
- QT通过IP地址定位地址(用get方法取数据)
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细) good
- Qt configure 参数不完全说明
- QT设置前景图位置(配色简单漂亮)
- QT图片旋转
- QT绘制半透明窗体(改写paintEvent,超级简单)
- 在windows下的QT编程中的_TCHAR与QString之间的转换
- QT 遍历目录查找指定文件(比较简单)
- QTcpSocket通信编程时阻塞与非阻塞的问题
- QT 强制杀死进程
- Qt见解:Post 与 Get 的区别(Get将参数直接与网址整合为一个整体,而Post则将其拆为两个部分)
- QT VS检测内存泄漏
- Qt 技巧: 解决未解析的SSL问题
- Qt 代码: 子窗口调用父窗口(其实就是用指针直接访问)
- Qt浅译:JSON Support in Qt(JSON只有六种数据类型)
- Qt技巧:Win7下打包发布Qt程序(解释的比较清楚,把exe和dll伪装合并成一个文件)
- 让Qt支持Win7的Aero和毛玻璃效果
- Qt mac QMYSQL(动态加载插件QPluginLoader的用法)
- qt实现-给SQLITE添加自定义函数