zoukankan      html  css  js  c++  java
  • Qt自适应大小显示图片,添加菜单

    由于后面的图像处理需要UI,OpenCV自带也不怎么会,MFC实在懒得学的。听同学说Qt不错,就用Qt做UI了。

    本文主要介绍三个内容:在Qt Creator中使用OpenCV2、Qt中自适应显示图片以及在Qt窗口中添加菜单

    1.在Qt Creator中使用OpenCV2

    一直使用 Visual Studio作为开发环境,OpenCV2在Visual Studio中也已经配置好了,而且Qt也有官方开发的Visual Studio的插件,所以就想着直接在Visual Studio中用OpenCV2+Qt5的。但是Qt在Visual Studio用着实在别扭,特别是UI文件同步到VS中有一定的延迟,也就是你在UI上拖放了一个Button,但是要过一段时间VS的自动提示才会有那个Button对象名的提示,并且改动UI后要首先编译一次。所以,最后决定在Qt Creator中使用OpenCV2。

    网上看了不少Qt Creator中使用OpenCV2都是自己编译OpenCV的源代码生成库文件,然后再Qt Creator中使用。我是直接使用OpenCV为VS预先编译好的库文件,配置方法也很简单,就是打开项目的pro文件,在该文件中添加如下内容:

    INCLUDEPATH += E:/opencv/build/include
        E:/opencv/build/include/opencv2
    
    win32:CONFIG(debug, debug|release): {
    LIBS += -LE:/opencv/build/x86/vc12/lib 
    -lopencv_calib3d249d 
    -lopencv_contrib249d 
    -lopencv_core249d 
    -lopencv_features2d249d 
    -lopencv_flann249d 
    -lopencv_gpu249d 
    -lopencv_highgui249d 
    -lopencv_imgproc249d 
    -lopencv_legacy249d 
    -lopencv_ml249d 
    -lopencv_nonfree249d 
    -lopencv_objdetect249d 
    -lopencv_photo249d 
    -lopencv_stitching249d 
    -lopencv_ts249d 
    -lopencv_video249d 
    -lopencv_videostab249d
    } else:win32:CONFIG(release, debug|release): {
    LIBS += -LE:/opencv/build/x86/vc12/lib 
    -lopencv_core249 
    -lopencv_imgproc249 
    -lopencv_highgui249 
    -lopencv_ml249 
    -lopencv_video249 
    -lopencv_features2d249 
    -lopencv_calib3d249 
    -lopencv_objdetect249 
    -lopencv_contrib249 
    -lopencv_legacy249 
    -lopencv_flann249
    }

    把上面文件的路径以及版本号改成自己机器上的即可。

    2.Qt窗口自适应大小显示图片

    实现思路也挺简单的,使用QLabel显示图片,把这个QLabel放在一个ScrollArea上面,这样图片过大的时候会自动的添加滚动条,最后窗体使用水平布局,这样ScrollArea的大小会随着窗口的大小自动改变。下面上代码

    private:
        Ui::MainWindow *ui;
        QLabel *label ;

    首先声明一个QLabel用于图片(ScrollArea在设计器上拖放到窗体上,并设置窗口的布局方式为水平布局)。

    设置QLabel的pixmap,并设置QLabel的大小和图片一致,最后将该QLabel添加到ScrollArea上。

    QString fileName = QFileDialog::getOpenFileName(this,"Choose Image","x:/image",("Image File(*.*)")) ;
        QImage image ;
        image.load(fileName) ;
    
        label = new QLabel();
        label->setPixmap(QPixmap::fromImage(image));
        label->resize(QSize(image.width(),image.height()));
        ui->scrollImag->setWidget(label);

    效果如下:

    image

    图片比较大,自动的添加了滚动条。

    image

    改变了窗口的大小,图片全部显示出来,滚动条消失。

    3.添加菜单

    Qt中窗体上的菜单栏对象是QMenuBar,菜单栏上可以有多个菜单(QMenu),每个菜单可以下拉多个选项(QAction)。

    首先需要想窗体中添加一个QMenuBar(Qt5好像是默认添加的),然后一个个菜单,并添加到QMenuBar上。

    fileMenu = ui->menuBar->addMenu(tr("File"));
    grayLevelTransMenu = ui->menuBar->addMenu(tr("LineTransform")) ;

    menuBar的addMenu的返回值是QMenu的实例,这里添加两个菜单:File和LineTransform

    接下来要创建菜单选项也就是Action,并为这些Action绑定上槽函数,最后将创建好的Action添加到菜单上就完成了。

    private:
        void createMenu();
        void createAction();
    
    private:
        Ui::MainWindow *ui;
        QLabel *imageLabel ;
    
        QMenu *fileMenu ;
        QMenu *grayLevelTransMenu ;
    
        QAction *openImageAction ;
        QAction *lineTransformAction ;
        QAction *logTransformAction ;
        QAction *powerTransfromAction ;
        QAction *expTransformAction;
        QAction *grayEqualizeAction;
    
    private slots:
        void openImageActionSlot();
        void lineTransformActionSlot();
        void logTransformActionSlot();
        void powerTransfromActionSlot();
        void expTransformActionSlot();
        void grayEqualizeSlot();

    声明需要的菜单(QMenu)和菜单选项(QAction),并且声明好了每个QAction所使用的槽函数。CreateMenu和CreateAction用来创建菜单和菜单选项的。

    openImageAction = new QAction(tr("Open Image"),this) ;
        QObject::connect(openImageAction,SIGNAL(triggered()),this,SLOT(openImageActionSlot()));

    创建打开图片的菜单选项,并绑定好了槽函数,其余的菜单选项于此类似。

    fileMenu = ui->menuBar->addMenu(tr("File"));
        fileMenu->addAction(openImageAction);

    创建File菜单,并将打开图片的菜单选项添加到其下。

    最终效果:

    image

  • 相关阅读:
    Android开发(二十一)——自动更新
    Android开发(十九)——ViewFlipper中的onClick事件和onFling事件冲突
    Android开发(十八)——头部、中部、底部布局技巧
    Android开发(十七)——关闭中间activity
    Android开发(十六)——Android listview onItemClick事件失效的原因
    Android开发(十五)——ListView中Items的间距margin
    Android开发(十四)——SimpleAdapter与自定义控件
    [ MongoDB ] 3.X权限认证控制
    批量修改主机密码并发送到邮箱
    [ ceph ] CEPH 部署完整版(CentOS 7 + luminous)
  • 原文地址:https://www.cnblogs.com/wangguchangqing/p/4049797.html
Copyright © 2011-2022 走看看