实例QT程序 —— Qt 控件及子控件截图

目录

1.简介
2.效果图
3.重点讲解
4.源码



1.简介

本文主要介绍了如何实现Qt控件及子控件截图,重点内容包含

  • 如何获取指定控件及其子控件的对象名称及对象类型;
  • 如何对指定控件截图并显示。

本文还有动态效果图、重点讲解和源码,读者们可以方便查看学习和交流。


回目录

2.效果图

Qt控件及子控件截图示例
Qt控件及子控件截图示例


回目录

3.重点讲解

1)如何获取指定控件及其子控件的对象名称及对象类型

通过递归地方式依次遍历控件布局中包含的所有子布局、子控件的方式来获取指定控件及其子控件的对象信息(对象名称、对象类型名称)。

QStringList SnapShotTool::getWdtChildren(QLayout *wdtLay, QHash<QString/*控件名称*/, QWidget*/*控件指针*/> &hashNameWdt)
{
    QStringList items;
    if( wdtLay ){
        int cnt = wdtLay->count();
        for (int i=0; i<cnt; i++) {
            QLayoutItem *it = wdtLay->itemAt(i);
            QWidget *wdt = it->widget();
            QLayout *layIt = it->layout();
            if( wdt ){
                QString objName = wdt->objectName();
                QString objClassName = wdt->metaObject()->className();
                QString strName = QString("%1:%2").arg(objClassName).arg(objName);
                hashNameWdt.insert(strName, wdt);
                items << strName;
                items << getWdtChildren(wdt->layout(), hashNameWdt);
            }else if( layIt ){
                items << getWdtChildren(layIt, hashNameWdt);
            }
        }
    }
    return items;
}

获取控件的对象名称、对象类型名称的方法如下:

	QString objName = wdt->objectName();
    QString objClassName = wdt->metaObject()->className();

以下是“待截图控件信息(对象类型名称:对象名称)列表”的截图信息:
待截图控件信息列表
待截图控件信息(对象类型名称:对象名称)列表


2)如何对指定控件截图并显示

通过控件QWidget提供的grab方法可以对控件截图,截图数据类型为QPixmap:

QPixmap QWidget::grab(const QRect &rectangle = QRect( QPoint( 0, 0 ), QSize( -1, -1 ) ))

通过控件QLabel提供的setPixmap方法可以显示控件截图信息:

void QLabel::setPixmap(const QPixmap &)

也通过QPixmap提供的save方法保存控件截图信息为*.PNG等图片文件格式到本地电脑目录:

bool QPixmap::save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) const

最后,通过SnapShotTool提供的setSnapShotWidget方法,我们就可以获取指定控件及子控件的截图信息了,大家可以去试一试:

    void SnapShotTool::setSnapShotWidget(QWidget *wdtSnapShot);

回目录

4.源码

源码下载地址
https://download.csdn.net/download/Redboy_Crazy/12783401

SnapShotTool.h
#ifndef SNAPSHOTTOOL_H
#define SNAPSHOTTOOL_H

#include <QWidget>

class QLabel;
class QComboBox;

class SnapShotTool : public QWidget
{
    Q_OBJECT
public:
    explicit SnapShotTool(QWidget *parent = nullptr);

    QStringList getWdtChildren(QLayout *wdtLay, QHash<QString/*控件名称*/, QWidget*/*控件指针*/> &hashNameWdt);

    void setSnapShotWidget(QWidget *wdtSnapShot);

private slots:
    void on_btnSnapShot_clicked();

signals:

private:
    QHash<QString/*控件名称*/, QWidget*/*控件指针*/> m_hashNameWdt;

    QLabel *m_labShowGrab;  // 显示指定控件的截图

    QComboBox *m_cBoxItems; // 待截图控件的项目控件
};

#endif // SNAPSHOTTOOL_H




SnapShotTool.cpp
#include "SnapShotTool.h"
#include <QLabel>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QComboBox>

SnapShotTool::SnapShotTool(QWidget *parent) : QWidget(parent)
{
    m_labShowGrab = new QLabel();
    m_labShowGrab->hide();

    QLabel *labName = new QLabel("待截图控件信息列表:", this);

    QPushButton *m_btnSnapShot = new QPushButton("获取控件截图信息", this);

    connect(m_btnSnapShot, &QPushButton::clicked,
            this, &SnapShotTool::on_btnSnapShot_clicked);

    m_cBoxItems = new QComboBox(this);

    QHBoxLayout *lay = new QHBoxLayout(this);
    lay->addWidget(labName);
    lay->addWidget(m_cBoxItems);
    lay->addWidget(m_btnSnapShot);
    this->setLayout(lay);

    this->setWindowTitle("控件截图工具");
}

QStringList SnapShotTool::getWdtChildren(QLayout *wdtLay, QHash<QString/*控件名称*/, QWidget*/*控件指针*/> &hashNameWdt)
{
    QStringList items;
    if( wdtLay ){
        int cnt = wdtLay->count();
        for (int i=0; i<cnt; i++) {
            QLayoutItem *it = wdtLay->itemAt(i);
            QWidget *wdt = it->widget();
            QLayout *layIt = it->layout();
            if( wdt ){
                QString objName = wdt->objectName();
                QString objClassName = wdt->metaObject()->className();
                QString strName = QString("%1:%2").arg(objClassName).arg(objName);
                hashNameWdt.insert(strName, wdt);
                items << strName;
                items << getWdtChildren(wdt->layout(), hashNameWdt);
            }else if( layIt ){
                items << getWdtChildren(layIt, hashNameWdt);
            }
        }
    }
    return items;
}

void SnapShotTool::setSnapShotWidget(QWidget *wdtSnapShot)
{
    m_hashNameWdt.clear();
    QString objName = wdtSnapShot->objectName();
    QString objClassName = wdtSnapShot->metaObject()->className();
    QString strName = QString("%1:%2").arg(objClassName).arg(objName);
    m_hashNameWdt.insert(strName, wdtSnapShot);

    QStringList items = getWdtChildren(wdtSnapShot->layout(), m_hashNameWdt);
    m_cBoxItems->clear();
    items.prepend(strName);
    m_cBoxItems->addItems(items);
}

void SnapShotTool::on_btnSnapShot_clicked()
{
    qDebug() << __FUNCTION__;

    QString item = m_cBoxItems->currentText();

    if ( !item.isEmpty() ){
        qDebug() << item;
        QWidget *wdt = m_hashNameWdt.value(item);
        QPixmap pix = wdt->grab();
        m_labShowGrab->setWindowTitle(item);
        m_labShowGrab->setPixmap(pix);
        m_labShowGrab->show();
    }
}

回目录




加油,向未来!GO~
Come on!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt/C++是一种开发桌面应用程序的跨平台开发框架,它提供了丰富的工具和类库,能够方便快捷地编写自定义控件源码。 首先,我们需要创建一个继承自QWidget或QFrame的类来实现自定义控件。在这个类中,我们可以重载一些事件处理函数来实现控件的特定功能,比如绘制事件函数paintEvent()、鼠标事件函数mousePressEvent()等等。通过这些函数,我们可以控制控件的外观、响应用户输入等。 在实现自定义控件的外观时,可以利用Qt提供的各种绘图工具和API。例如,可以使用QPainter类来绘制各种形状、图像、文字等,还可以使用QPen和QBrush类来设置绘制的样式和颜色。通过这些工具,我们可以实现各种个性化的外观效果,如圆角、渐变、阴影等。 对于自定义控件的功能实现,可以根据需求使用Qt提供的各种功能模块。比如,使用QTimer类实现定时器功能,使用QMediaPlayer类实现音视频播放功能等等。此外,Qt还提供了一系列的信号和槽机制,可以方便地实现控件之间的交互和通信。 在自定义控件的使用方面,可以通过在其他QWidget中使用该控件的对象的方式来使用它。将自定义控件放入项目中,然后在界面中添加该控件实例对象,即可展示该控件,并与其交互。也可以通过在UI界面设计软件中将该控件拖拽到需要的位置上,然后使用信号槽机制来实现与其他控件的交互。 总之,Qt/C++编写自定义控件源码需要熟悉Qt的基本概念和API,并结合自身的需求来设计和实现控件的外观和功能。通过合理的设计和编码,可以创建出各种各样的自定义控件,丰富应用程序的界面和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值