• qt二维码示例


    原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://blog.csdn.net/hiwubihe/article/details/38679621,qq:1269122125。

    移动终端的普及,二维码的使用越来越广泛,最近小小的研究了一下QT下二维码的使用。
    二维码(Two-dimensional code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中,可实现的应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载商品交易定位/导航电子凭证、车辆管理、信息传递、名片交流、wifi共享等。如今智能手机扫一扫(简称313)功能的应用使得二维码更加普遍。 

    QZXing:Qt包装ZXing的解码库。

    更多参考:https://projects.developer.nokia.com/QZXing.  本文开发二维码的小工具采用的就是QZXing库。库的使用方法很简单,从上面网址上下载下来源代码,源代码根目录下有个pri文件,因为我是在VS2010中开发的,按道理是可以在VS工程中编译这包源码包的。但是编译总是失败。所以采用另外的方法,新建个QTcreator工程,在工程中把源码包拷贝进工程中,再在pro工程文件中加上include (QZXing/QZXing.pri)。编译即可生成dll文件。可能qtcreator采用的mingw编译器,编译生成的dll在msvc中不能静态加载。尝试了静态加载都是失败的,而采用QT自带的QLibrary加载DLL是成功的。

    程序运行效果如下:

    启动后



    选择二维码图片后效果:



    1.自定义一个窗体类QrCodeForm.h

     
    typedef bool (*fpGetQrStr)(const char*, char*, int);
    class CQrCodeForm : public UiBaseDialog
    {
        Q_OBJECT
     
    public:
        CQrCodeForm(QWidget *parent = 0);
        ~CQrCodeForm();
    private slots:
        void slots_file_selected();
    private:
        Ui::Form ui;
        QString m_fileName;
        QLibrary *pdllLib;
        fpGetQrStr GetQrStr;
    };
      2.窗体类实现 QrCodeForm.cpp
     
    CQrCodeForm::CQrCodeForm(QWidget *parent)
        : UiBaseDialog(parent)
    {
        ui.setupUi(this);
        createTitleBar(ui.Title,WindowToolMin | WindowToolClose,tr("二维码识别"));
        QDesktopWidget *desk=QApplication::desktop();   
        int wd=desk->width();   
        int ht=desk->height();   
        this->move((wd-width())/2,(ht-height())/2);
        connect(ui.pushButton,SIGNAL(clicked()),this,SLOT(slots_file_selected()));
        pdllLib =new QLibrary("QTCode.dll");
        if(!pdllLib->load())
        {
             return ;
        }
        else
        {
            GetQrStr=(fpGetQrStr)pdllLib->resolve("GetQrStr");
            if(GetQrStr == NULL)
            {
                return ;
            }
        }
        return ;
     
    }
     
    CQrCodeForm::~CQrCodeForm()                                     
    {
     
    }
     
    void CQrCodeForm::slots_file_selected()
    {
        m_fileName = QFileDialog::getOpenFileName(this, 
                                                tr("二维码打开文件"),
                                                "C:\",
                                                tr("任何文件(*.*)"
                                                ";;文本文件(*.png)"
                                                ));
        ui.lineEdit->setText(m_fileName);
        //
        
        char buffer[QRBUFSIZ] = {0};
        bool bResult = GetQrStr(m_fileName.toStdString().c_str(), buffer, QRBUFSIZ);
     
        //UTF-8编码
        QString ss = QTextCodec::codecForName("UTF-8")->toUnicode(buffer);
        if(bResult)
        {
            ui.textEdit->setText(ss);
            QImage* img=new QImage;
            //加载图像
            if(! ( img->load(m_fileName) ) ) 
            {
                QMessageBox::information(this,
                                         tr("打开图像失败"),
                                         tr("打开图像失败!"));
                delete img;
                return;
            }
            * img=img->scaled(ui.label->width(),ui.label->height(),Qt::KeepAspectRatio);
            ui.label->setPixmap(QPixmap::fromImage(*img));
        }
        else
        {
            ui.textEdit->setText(tr("图片不是合法二维图片"));
        }
    }
     
    qt版本:4.8.6,开发环境:vs2010 
    源码下载地址:http://download.csdn.net/detail/hiwubihe/9542092
     
     
    欢迎技术交流沟通,转载请注明出处并保持作品的完整性。 作者:程序人生 qq1269122125
  • 相关阅读:
    递归
    高等数学思维导图——1.函数与极限
    sort方法和自定义比较器的写法
    PriorityQueue(优先队列)
    常用JAVA API :HashSet 和 TreeSet
    常用Java API:HashMap 和 TreeMap
    ArrayList、Vector和LinkedList的区别
    构造方法
    面向对象特点:封装、继承、多态
    匿名对象
  • 原文地址:https://www.cnblogs.com/qq1269122125/p/3924039.html
Copyright © 2020-2023  润新知