Qt笔记(十七)cmake编译Qt项目

Qt笔记(十七)cmake编译Qt项目

  • [1. 文件内容与文件结构](#1. 文件内容与文件结构)
    • 1.1.文件目录
    • [1.2. CMakeLists.txt内容](#1.2. CMakeLists.txt内容)
    • [1.3. main.cpp文件](#1.3. main.cpp文件)
    • [1.4. mouseevent.h](#1.4. mouseevent.h)
    • [1.5. mouseevent.cpp](#1.5. mouseevent.cpp)
    • [1.6. 生成Visual Studio项目后编译报错](#1.6. 生成Visual Studio项目后编译报错)
    • [1.7. 界面显示中文乱码问题](#1.7. 界面显示中文乱码问题)

1. 文件内容与文件结构

1.1.文件目录

文件夹下文件,其中CMakeLists.txt是我新添加的。

bash 复制代码
MouseEvent
        CMakeLists.txt
        main.cpp
        mouseevent.cpp
        mouseevent.h

1.2. CMakeLists.txt内容

bash 复制代码
cmake_minimum_required(VERSION 3.5)

project(mouseEvent LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

include_directories(
    ${PROJECT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_BINARY_DIR}
)

# 由于采用set(CMAKE_AUTOUIC ON)的方式处理ui文件,编译时会报错找不到ui文件。
# 需要将ui文件夹加入AUTOUIC的搜索目录,这样AUTOUIC处理时才能找到ui文件。
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_SOURCE_DIR}/ui)

file(GLOB PRO_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB PRO_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
file(GLOB PRO_UI ${CMAKE_CURRENT_SOURCE_DIR}/*.ui)
file(GLOB PRO_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc)

add_executable(mouseEvent
    ${PRO_SRC}
    ${PRO_INCLUDE}
    ${PRO_UI}
    ${PRO_RESOURCES}
)

target_link_libraries(mouseEvent PRIVATE Qt5::Widgets)

1.3. main.cpp文件

cpp 复制代码
#include "mouseevent.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MouseEvent w;
    w.show();

    return a.exec();
}

1.4. mouseevent.h

cpp 复制代码
#ifndef MOUSEEVENT_H
#define MOUSEEVENT_H

#include <QMainWindow>
#include <QLabel>
#include <QStatusBar>
#include <QMouseEvent>
class MouseEvent : public QMainWindow
{
    Q_OBJECT

public:
    MouseEvent(QWidget *parent = 0);
    ~MouseEvent();
protected:
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void mouseDoubleClickEvent(QMouseEvent *e);
private:
    QLabel *statusLabel;
    QLabel *MousePosLabel;
};

#endif // MOUSEEVENT_H

1.5. mouseevent.cpp

cpp 复制代码
#include "mouseevent.h"

MouseEvent::MouseEvent(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr(u8"鼠标事件"));					//设置窗体的标题
    statusLabel = new QLabel;						//(a)
    statusLabel->setText(tr(u8"当前位置:"));
    statusLabel->setFixedWidth(100);
    MousePosLabel = new QLabel;						//(b)
    MousePosLabel->setText(tr(""));
    MousePosLabel->setFixedWidth(100);
    statusBar()->addPermanentWidget(statusLabel);	//(c)
    statusBar()->addPermanentWidget(MousePosLabel);
    this->setMouseTracking(true);					//(d)
    resize(400,200);
}

void MouseEvent::mousePressEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";														//(a)
    if(e->button()==Qt::LeftButton)
    {
        statusBar()->showMessage(tr(u8"左键:")+str);
    }
    else if(e->button()==Qt::RightButton)
    {
        statusBar()->showMessage(tr(u8"右键:")+str);
    }
    else if(e->button()==Qt::MidButton)
    {
        statusBar()->showMessage(tr(u8"中键:")+str);
    }
}

void MouseEvent::mouseMoveEvent(QMouseEvent *e)
{
    MousePosLabel->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}

void MouseEvent::mouseReleaseEvent(QMouseEvent *e)
{
    QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")";
    statusBar()->showMessage(tr(u8"释放在:")+str,3000);
}

void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e){}

MouseEvent::~MouseEvent()
{

}

1.6. 生成Visual Studio项目后编译报错

bash 复制代码
warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

解决办法:warning C4819 解决方案 warning C4819: The file contains a character that cannot be represented in the cu_warning c4819 the file contains a character that c-CSDN博客

修改编码方式为:打开出现warning的文件,Ctrl+A全选,然后在文件菜单:file->advanced save options (高级保存选项),在弹出的选项中选择新的编码方式为:UNICODE codepage 1200 ,点击确定,问题就解决了。

1.7. 界面显示中文乱码问题

如下,在中文前添加u8。(上面列出的代码是修改后的代码)

cpp 复制代码
statusBar()->showMessage(tr(u8"左键:")+str);

运行结果如下:

相关推荐
xuhaoyu_cpp_java18 分钟前
项目学习(三)代码生成器
java·经验分享·笔记·学习
my_daling33 分钟前
松下伺服驱动器参数保存流程(已在松下A5上验证)
笔记
金融支付架构实战指南1 小时前
CQRS + 命令模式 + 事件驱动 + 数据库持久化
数据库·ddd·命令模式·领域驱动模型
金融支付架构实战指南1 小时前
CQRS 命令 vs GOF 命令模式
ddd·命令模式·领域驱动模型
智者知已应修善业1 小时前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
juesdo2 小时前
青岑CTF之 EZPHP系列
笔记·web安全·php
小陈phd2 小时前
Text2SQL智能体学习笔记(二)——NL2SQL落地的隐形基石:元数据库
数据库·笔记·学习
8Qi82 小时前
Windows 系统Claude Code安装与使用笔记
windows·笔记·agent·claudecode
nnsix3 小时前
Windows电脑 驱动 笔记
笔记
疯狂打码的少年3 小时前
【程序语言与编译】程序设计语言分类(机器/汇编/高级)
汇编·笔记