热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt中如何对控件实现整体缩放和界面复制?

标题中的整体缩放指的是,当改变控件大小时,控件带着内部所有视觉元素,作为一个整体缩放,就像变成了它自己的缩略图一样,但缩放后的控件仍然能正常操作;类似于WPF中的Viewbox控件;标题中的界面复
标题中的整体缩放指的是,当改变控件大小时,控件带着内部所有视觉元素,作为一个整体缩放,就像变成了它自己的缩略图一样,但缩放后的控件仍然能正常操作;类似于WPF中的Viewbox控件;
标题中的界面复制指的是,制作一个控件的缩略图,放在另一个图像类控件上显示。当然:1.这个缩略图是实时的;2.整体缩放功能是必须有的;3.就算源控件的一部分或全部因为(被遮挡、不在父容器窗口内、没有设置父容器从而没有加入可视树)等原因不可见,只要该界面本身存在,就存在正常的缩略图。类似于WPF中的VisualBrush类。
Qt中是否内置了提供相应功能的类?没有的话,能否自己方便的实现?
谢谢,因为可用分不多,所以只能在有效答案出来后再加分,望谅解,加分能让您满意的

8 个解决方案

#1


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
class CGroupBox : public QGroupBox
{
public:
    CGroupBox(QWidget *parent = NULL) : QGroupBox(parent)
    {

    }

protected:
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug() << event->pos();
    }
};

class CDlg : public QDialog
{
public:
    CDlg(QWidget *parent = NULL) : QDialog(parent)
    {
        CGroupBox *pgb = new CGroupBox(this);
        pgb->setTitle("test");
        QPushButton *ppbOk = new QPushButton("test", this);
        QHBoxLayout *phLayout = new QHBoxLayout(pgb);
        phLayout->addWidget(ppbOk);

        phLayout = new QHBoxLayout(this);
        phLayout->addWidget(pgb);
    }

};

int main(int argc, char**argv)
{
    QApplication app(argc,argv);

    CDlg dlg;
    dlg.resize(500, 500);
    dlg.exec();

    return app.exec();
}

#2


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


class CDlg : public QWidget
{
public:
    CDlg(QWidget *parent = NULL) : QWidget(parent)
    {
        QGroupBox *pgb = new QGroupBox("test", this);
        QPushButton *ppbOk = new QPushButton("test", this);
        QHBoxLayout *phLayout = new QHBoxLayout(pgb);
        phLayout->addWidget(ppbOk);

        phLayout = new QHBoxLayout(this);
        phLayout->addWidget(pgb);
    }

};

int main(int argc, char**argv)
{
    QApplication app(argc,argv);

    CDlg dlg;
    dlg.resize(500, 500);
    dlg.show();

    return app.exec();
}
以上应该是你要的结果。

#3


对应的是第一个问题吗?这个测试代码是如何演示的?我拖拉窗口大小,按钮只是宽度跟着窗口变化,不符合我的要求。我需要的是类似于将鼠标放在Win7任务栏图标上弹出来的缩略图那样,包括控件大小、控件坐标、字体等所有可视元素都被同步缩放的效果

#4


第一个问题,控件中如果没有其他控件,可以重新实现控件的paintEvent事件处理函数,通过setWindow函数和setViewport函数的组合使用来达到整体缩放的效果,这很简单。但是如果控件中还有其他控件,就意味着你需要在resize父控件的同时,重新设置其所有子控件的pos和size,而且子控件的paintEvent事件处理函数也要和父控件一样setWindow和setViewport,那么,你需要在父控件的sizeEvent事件处理函数中告诉其所有子控件重新设置pos和size。这个就麻烦一点,但是应该还是可以实现的。

另外对第一个问题补充一下,如果可能,你也可以不用子控件,而是通过自己画的方式在特定位置画出“子控件”并根据位置等信息让这些“子控件”对事件作出响应,这样你实际上只定义了一个控件,但是这个控件看上去是里面有很多子控件。

第二个问题,用render函数应该可以很轻松的解决。

#5


引用 4 楼 rjsloth 的回复:
第一个问题,控件中如果没有其他控件,可以重新实现控件的paintEvent事件处理函数,通过setWindow函数和setViewport函数的组合使用来达到整体缩放的效果,这很简单。但是如果控件中还有其他控件,就意味着你需要在resize父控件的同时,重新设置其所有子控件的pos和size,而且子控件的paintEvent事件处理函数也要和父控件一样setWindow和setViewport,那么,你需要在父控件的sizeEvent事件处理函数中告诉其所有子控件重新设置pos和size。这个就麻烦一点,但是应该还是可以实现的。

另外对第一个问题补充一下,如果可能,你也可以不用子控件,而是通过自己画的方式在特定位置画出“子控件”并根据位置等信息让这些“子控件”对事件作出响应,这样你实际上只定义了一个控件,但是这个控件看上去是里面有很多子控件。

第二个问题,用render函数应该可以很轻松的解决。

谢谢。
第一个问题,我要缩放的是一个根控件,所有可操作控件都是它的子级。另一方面,如果采用“画”的方式,虽然还是可以响应鼠标事件,但是应该没法把光标定位到一个“画”出来的文本框里面还让它在里面一闪一闪的,所以看起来只能采用你第一段后半部分说的方案。还有一个问题是字体的缩放,假设控件未缩放的时候某个字符宽高都是20,控件宽缩放为4/5,高缩放为2/3,那经过这样缩放之后能变成宽16,高13.33的压扁的字符吗?
然后对于这个方案和render函数,能给出一个Demo吗?我没有搜索到render函数的用法

#6


那就只能重载resizeEvent了,在重载事件里根据父窗口布局大小,来相应缩放子控件的大小


QObjectList *pChildList = this->children();//找到所有的孩子,再判断孩子是否是派生自QWidget,只有这样的孩子,才是窗体,才能对窗体缩放,

可以通过
setGeometry()
resize
等方法实现缩放

如果你要实现鼠标放在控件上,你需要重载,mouse hover事件。

#7


首先,由于你的子widget有字符编辑控件,所以纯自己画的话,确实比较麻烦,但实际上应该还是可以的,不过这个没必要继续深究了。
然后,关于使用setWindow和setViewport之后,字体是否会等比例缩放,是可以等比例缩放的,也可以不等比例缩放,关键在于你是如何设置setWindow和setViewport中对应的区域的高宽比。下一楼的代码中,ScaleWidget的paintEvent函数中,没注释掉的设置是字符会等比缩放的情况,注释掉的设置是字符会被压缩的情况。
最后,关于render,我的代码中,让pShower总是拷贝显示pButtonA上显示的内容,你可以通过点击两个按钮来观看pShower上的显示情况,可以通过pButtonA是否获得焦点来验证pShower上显示的是pButtonA的内容。代码中的两个connect是为了让pShower实时显示pButtonA的内容。

把我下一楼的回复贴到某个cpp文件中,建个空工程,然后跑一下这个cpp文件就可以了。代码写得比较仓促,不严谨的地方不用深究。

#8


#include 
#include 
#include 
#include 

class Shower: public QWidget
{
public:
    Shower(QWidget* copyWidget, QWidget* parent = 0): QWidget(parent),
                                                      m_pCopyWidget(copyWidget)
    {
    }

    ~Shower()
    {
    }

protected:
    void paintEvent(QPaintEvent *event)
    {
        m_pCopyWidget->render(this);
    }

private:
    QWidget* m_pCopyWidget;
};

class ScaleWidget: public QWidget
{
public:
    ScaleWidget(QWidget* parent = 0): QWidget(parent)
    {
        resize(400, 200);
    }

    ~ScaleWidget()
    {
    }

protected:
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
/*
        painter.setWindow(-50, -50, 100, 100);
        painter.setViewport(0, 0, width(), height());
*/
        painter.setWindow(-50, -50, 100, 100);

        int minLength = width() < height() ? width() : height();

        painter.setViewport((width() - minLength) >> 1, (height() - minLength) >> 1, minLength, minLength);

        painter.fillRect(-10, -10, 20, 20, Qt::red);
        painter.drawText(-50, -50, 30, 100, Qt::AlignCenter, "TEST");
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QWidget mainWidget;
    mainWidget.resize(650, 150);

    QPushButton* pButtonA = new QPushButton("ButtonA", &mainWidget);
    pButtonA->resize(150, 50);
    pButtonA->move(50, 50);

    QPushButton* pButtonB = new QPushButton("ButtonB", &mainWidget);
    pButtonB->resize(150, 50);
    pButtonB->move(250, 50);

    Shower* pShower = new Shower(pButtonA, &mainWidget);
    pShower->resize(150, 50);
    pShower->move(450, 50);

    pShower->connect(pButtonA, SIGNAL(clicked()), SLOT(update()));
    pShower->connect(pButtonB, SIGNAL(clicked()), SLOT(update()));

    mainWidget.show();

    ScaleWidget scaleWidget;
    scaleWidget.show();

    return app.exec();
}

推荐阅读
  • ExcelApp#启动excel程序ExcelAppCreateOleObject(“Excel.Application”);#加载文件但不显示文件内容(true表 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 转载:MFC 获得各类指针、句柄的方法
    2019独角兽企业重金招聘Python工程师标准转载:最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,Syst ... [详细]
author-avatar
MiMe淘宝店
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有