• [Part 1] Ubuntu 16.04安装和配置QT5 | Part-1: Install and Configure Qt5 on Ubuntu 16.04


    本文首发于个人博客https://kezunlin.me/post/91842b71/,欢迎阅读!

    Part-1: Install and Configure Qt5 on Ubuntu 16.04

    Series

    Guide

    • qt: 5.7.0
    • qmake: 3.0 based on Qt 5.7.0
    • qtcreator: 3.5.1 based on Qt 5.5.1

    purge existing qt5 and qt4

    sudo apt-get purge qt5-default qtcreator 
    sudo apt-get purge qt4-designer qt4-dev-tools
    

    install qt57

    In addition, building graphical Qt applications requires OpenGL libraries and headers installed. On Ubuntu and other Debian-based Linux systems you can get OpenGL and the minimal set of development tools by installing the packages libgl1-mesa-dev and build-essential, i.e. by running this command:

    sudo apt-get install build-essential libgl1-mesa-dev
    

    Download qt and install.

    sudo apt-get install build-essential libgl1-mesa-dev
    wget http://download.qt.io/official_releases/qt/5.7/5.7.0/qt-opensource-linux-x64-5.7.0.run
    chmod +x qt-opensource-linux-x64-5.7.0.run
    ./qt-opensource-linux-x64-5.7.0.run
    

    install to /opt/Qt5.7.0

    cd /opt
    sudo ln -s /opt/Qt5.7.0 qt
    

    add qt bin to path

    vim .bashrc
    
    # added by kzl
    export PATH=/opt/cuda-8.0/bin:$PATH
    export PATH=/opt/MATLAB/R2016b/bin:$PATH
    export PATH=/opt/qt/5.7/gcc_64/bin:$PATH
    

    qt.conf for ld.so.conf.d

    cd /etc/ld.so.conf.d
    sudo vim qt.conf
    
    /opt/qt/5.7/gcc_64/lib
    
    sudo ldconfig
    

    or only install qtcreator (find_package error for qt5x11extra-config.cmake)

    sudo apt-get install qt5-default qtcreator
    sudo apt-get install qt4-designer qt4-dev-tools
    

    qtchooser

    add qt57.conf

    cat /usr/share/qtchooser/qt57.conf 
    
    /opt/qt/5.7/gcc_64/bin
    /opt/qt/5.7/gcc_64/lib
    
    # link to qt57
    cd /usr/lib/x86_64-linux-gnu/qtchooser
    sudo ln -s /usr/share/qtchooser/qt57.conf qt57.conf
    
    cd /usr/lib/x86_64-linux-gnu/qt-default/qtchooser
    
    sudo rm default.conf
    sudo ln -s /usr/share/qtchooser/qt57.conf default.conf
    ls -l default.conf
    default.conf -> /usr/share/qtchooser/qt57.conf
    

    qt conf

    /usr/share/qtchooser/

    • qt4-x86_64-linux-gnu.conf (FILE)
    • qt5-x86_64-linux-gnu.conf (FILE)
    • qt57.conf (FILE)

    /usr/lib/x86_64-linux-gnu/qtchooser/

    • 4.conf (link)
    • 5.conf (link)
    • qt4.conf (link)
    • qt5.conf (link)
    • qt57.conf (link)

    /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/

    • default.conf (link) qt57.conf

    qtchooser

    which qtchooser 
    /usr/bin/qtchooser
    
    qtchooser -l
    
    4
    5
    default
    qt4-x86_64-linux-gnu
    qt4
    qt5-x86_64-linux-gnu
    qt5
    

    qtchooser env

    qtchooser -print-env
    QT_SELECT="default"
    QTTOOLDIR="/opt/qt/5.7/gcc_64/bin"
    QTLIBDIR="/opt/qt/5.7/gcc_64/lib"
    

    export QT_QPA_PLATFORM_PLUGIN_PATH

    vim .bashrc
    export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/qt/5.7/gcc_64/plugins/platforms
    

    otherwise,errors may occur.
    Failed to load platform plugin "xcb".

    Qtcreator Tutorial

    install qtcreator

    sudo apt-get -y install qtcreator
    
    qtcreator -version
    
    Qt Creator 3.5.1 based on Qt 5.5.1
    

    create application

    Start qtcreator and create a Qt Widget Application named hello.

    add resource file
    Add a resource file named resource.qrc.

    hello-->right click--> Add New... --->qt---> qt resource file---> name resource---> generate resource.qrc
    

    and then import images to resource.qrc

    Resources | resource.qrt--->right click---> Add Prefix...---> name /prefix
    Resources | resource.qrt | /prefix--->right click ---> Add Existing Files... ---> choose images ---> OK
    

    use resource in mainwindow.ui

    button ---> property page ---> icon ---> Choose Resource... ---> select image ---> OK 
    

    Qt slots

    method 1

    steps:

    mainwindow.ui ---> choose button ---> right click ---> Go to slot... ---> choose clicked() ---> OK
    

    will add slots in mainwindow.h automatically

    private slots:
        void on_pushButtonOK_clicked();
    

    and in mainwindow.cpp

    void MainWindow::on_pushButtonOK_clicked()
    {
        
    }
    

    Tips: if we use on_pushButtonOK_clicked style, there is no need to connect with slots in MainWindow constructor by hand.

    method 2 (OK)

    add slots in mainwindow.h by hand

    private slots:
        void pushButtonCancel_clicked();
    

    and in mainwindow.cpp

    void MainWindow::pushButtonCancel_clicked()
    {
        
    }
    

    connect button with slot in mainwindow.cpp

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // connect
        connect(ui->pushButtonCancel, SIGNAL(clicked()), this, SLOT(pushButtonCancel_clicked()));
    }
    

    Code Example

    folder

    folder structure like this:

    $ tree hello/
    
    hello/
    ├── CMakeLists.txt
    ├── hello.pro
    ├── hello.pro.user
    ├── images
    │   ├── kezunlin_logo.png
    │   ├── logo.svg
    │   └── searchicon.png
    ├── main.cpp
    ├── mainwindow.cpp
    ├── mainwindow.h
    ├── mainwindow.ui
    └── resource.qrc
    
    1 directory, 11 files
    

    code

    mainwinow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
    private slots:
        void on_pushButtonOK_clicked(); // method1
        void pushButtonCancel_clicked(); // method2
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QMessageBox>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        // connect
        connect(ui->pushButtonCancel, SIGNAL(clicked()), this, SLOT(pushButtonCancel_clicked()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButtonOK_clicked()
    {
        QString text = ui->lineEditName->text();
        QMessageBox::information(this, "OK", text);
        ui->pushButtonOK->setText( tr("(OK. click me)") );
    }
    
    void MainWindow::pushButtonCancel_clicked()
    {
        QString text = ui->lineEditName->text();
        QMessageBox::information(this, "Cancel", text);
        ui->pushButtonCancel->setText( tr("(Cancel.click me)") );
    }
    

    main.cpp

    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 2.8.8)
    
    project(helloworld)
    
    # Find includes in corresponding build directories
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    # Instruct CMake to run moc automatically when needed.
    set(CMAKE_AUTOMOC ON)
    
    # ${QT_INCLUDE_DIRS} ${QT_LIBRARIES} and so on are all Qt4 Macro Definitions!!!!!
    # Find the QtWidgets library
    find_package(Qt5Core)
    find_package(Qt5Widgets)
    find_package(Qt5Gui)
    find_package(Qt5OpenGL)
    find_package(Qt5Xml)
    
    #message( [qt] ${Qt5Core_INCLUDE_DIRS} )
    #message( [qt] ${Qt5Core_LIBRARIES} )
    #message( [qt] ${Qt5Widgets_INCLUDE_DIRS} )
    #message( [qt] ${Qt5Widgets_LIBRARIES} )
    
    # cpp files
    aux_source_directory(. SRC_LIST)
    
    # ui files
    qt5_wrap_ui(ui_FILES mainwindow.ui)
    # resource files
    qt5_add_resources(qrc_FILES resource.qrc)
    
    message( [Main] ${SRC_LIST} ) # ./main.cpp./mainwindow.cpp
    message( [Main] ${ui_FILES} ) # build/ui_mainwindow.h
    message( [Main] ${qrc_FILES} )# build/qrc_resource.cpp
    
    # Tell CMake to create the helloworld executable
    add_executable(${PROJECT_NAME} ${SRC_LIST} ${ui_FILES} ${qrc_FILES})
    
    qt5_use_modules(${PROJECT_NAME} Core Widgets OpenGL Xml Gui)
    
    # Use the Widgets module from Qt 5.
    #qt5_use_modules(helloworld Widgets)
    
    # link other libraries
    #target_link_libraries (${PROJECT_NAME} ${SPEC_OPENCV_LIBS})
    

    CMakeLists.txt 2

    cmake_minimum_required(VERSION 3.0)
    
    set(PROJECT_NAME demo)
    
    set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)  # bin/
    
    set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
    set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
    
    set(CMAKE_CXX_STANDARD 11)
    #set(CMAKE_PREFIX_PATH ${QTDIR})
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTORCC ON)
    
    # QT5_DIR /opt/Qt5.7.0/5.7/gcc_64/lib/cmake/Qt5
    find_package(Qt5 REQUIRED Widgets Core Gui Network OpenGL)
    find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc features2d calib3d )
    find_package(Protobuf REQUIRED) # 3.6.1
    find_package(VTK REQUIRED) # 8.1.2
    include(${VTK_USE_FILE})
    
    MESSAGE( [Main] " VTK_INCLUDE_DIRS = ${VTK_INCLUDE_DIRS}")
    MESSAGE( [Main] " VTK_LIBRARIES = ${VTK_LIBRARIES}")
    
    find_package(PCL REQUIRED) # 1.9.1
    #find_package(PCL REQUIRED COMPONENTS common io filters visualization)
    
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    message ([main] "PCL_DIR = ${PCL_DIR}")
    message ([main] "PCL_FOUND = ${PCL_FOUND}")
    message ([main] "PCL_INCLUDE_DIRS = ${PCL_INCLUDE_DIRS}")
    message ([main] "PCL_LIBRARIES = ${PCL_LIBRARIES}")
    
    message ([main] "PCL_LIBRARY_DIRS = ${PCL_LIBRARY_DIRS}")
    message ([main] "PCL_COMMON_LIBRARIES = ${PCL_COMMON_LIBRARIES}")
    message ([main] "PCL_IO_LIBRARIES = ${PCL_IO_LIBRARIES}")
    message ([main] "PCL_FILTERS_LIBRARIES = ${PCL_FILTERS_LIBRARIES}")
    message ([main] "PCL_VISUALIZATION_LIBRARIES = ${PCL_VISUALIZATION_LIBRARIES}")
    
    include_directories(
    	./ # current folder
    
    #	${GFLAGS_INCLUDE_DIRS}
    #	${GLOG_INCLUDE_DIRS}
    #	${GTEST_INCLUDE_DIRS}
    	${PROTOBUF_INCLUDE_DIRS}
    	${Boost_INCLUDE_DIRS} 
    	${OpenCV_INCLUDE_DIRS}
    	${VTK_INCLUDE_DIRS}
    	${PCL_INCLUDE_DIRS}
    ) 
    
    set(SOURCE_FILES
        main.cpp
        MainWindow.cpp
        ./proto/camera_image.pb.cc
        ./proto/point_cloud.pb.cc
    )
    
    set(RESOURCE_FILE resource.qrc)
    
    add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${RESOURCE_FILE})
    
    target_link_libraries(${PROJECT_NAME} 
        Qt5::Widgets Qt5::Gui Qt5::Core Qt5::OpenGL Qt5::Network
    	${Boost_LIBRARIES}
    	${PROTOBUF_LIBRARIES}
    	${OpenCV_LIBRARIES}
    	${VTK_LIBRARIES}
    	${PCL_LIBRARIES}    
        pthread
        rt
    )
    

    cmake

    cd hello
    mkdir build
    cd build
    cmake ..
    make
    

    run

    ./helloworld
    

    screen snapshot like this:

    qt_hellowindow

    Reference

    History

    • 20180108: created.

    Copyright

  • 相关阅读:
    数据库规范化与经典三范式
    左右两个下拉框里的内容互换
    利用创造元素的方法进行下拉框内容的添加
    数组除重和应用随机数进行随机点名
    for 语句练习
    super和this
    linux常用命令
    g​e​t​A​t​t​r​i​b​u​t​e​和​g​e​t​P​a​r​a​m​e​t​e​r​区​别
    HTTP 方法:GET 对比 POST
    sql语句中字符串类型的变量前后需要使用单引号
  • 原文地址:https://www.cnblogs.com/kezunlin/p/11834857.html
Copyright © 2020-2023  润新知