Qt知识点总结

本文详细介绍了QtCreator中的各种常用快捷键,包括编辑代码、代码阅读、查找替换、运行调试、窗口切换、文件操作、网络编程、事件处理、部署工程以及单例模式等,帮助用户提高开发效率。
摘要由CSDN通过智能技术生成

qtcreator常用快捷键

键盘模拟鼠标

快捷键功能
Home跳到行首
End跳到行尾
Ctrl + Home跳到文件头
Ctrl + End跳到文件尾
Ctrl + Alt + 上下键复制行

代码编辑

快捷键功能
Ctrl + Enter当前行下方插入空白行
Ctrl + Shift + Enter当前行上方插入空白行
Ctrl + I[;]格式化代码
Shift + Delete剪切当前行
Ctrl + /注释当前行或者选中区域
Ctrl + Shift + R局部变量统一修改
Ctrl + Shift + V复制历史
Ctrl + S保存文件
Ctrl + Shift + S保存所有文件
Alt + Enter弹出代码生成提示
Alt + 鼠标同时输入

代码阅读

快捷键功能
F1查看帮助文档
F2快速切换变量和函数
F4cpp和h文件切换
Ctrl + 鼠标左键切换到声明
Ctrl + Shift + U查找所有使用该符号的地方
Ctrl + M创建书签
Ctrl + K打开定位器
Ctrl + L跳转到指定行
Ctrl + Tab在打开的文件中切换

查找替换

快捷键功能
Ctrl + F查找/替换当前文件中选中的内容
Ctrl + Shift + F查找/替换当前项目中选中的内容
F3查找下一个
Shift + F3查找上一个

运行调试

快捷键功能
Ctrl + B编译工程
Ctrl + R运行工程
F5调试运行
Ctrl + Shift + F5重启调试
F9设置和取消断点
F10单步跳过
F11单步进入

窗口切换

快捷键功能
Ctrl + 数字导航窗口切换
Alt + 数字底部窗口切换
Alt + 0隐藏或显示边栏
Ctrl + W关闭当前编辑的文件

设置图标

  • 设置运行后,左上角和下面任务栏的图标
// 设置图标
this->setWindowIcon(QIcon(":/images/wx.ico"));  // "xxx"中填路径
  • 设置exe文件的图标
// 在xxx.pro中添加 - 注意这里要填wx.ico对于xxx.pro的相对路径
RC_ICONS += wx.ico  

信号和槽

使用QSignalMapper匹配信号发送

  • 这里以QPushButton的按钮文本内容为例
  • 发送者
// .h文件中引入头文件并创建信号
#include <QSignalMapper>

signals:
    void btnClicked(const QString& text);

// .cpp中使用QSignalMapper
// ...
QSignalMapper* mapper = new QSignalMapper(this);
QList<QPushButton*> btnList = findChildren<QPushButton*>(); // 找到所有的子对象QPushButton
for(auto btn : btnList)
{
    connect(btn, SIGNAL(clicked()), mapper, SLOT(map()));
    mapper->setMapping(btn, btn->text());
}
connect(mapper, SIGNAL(mapped(QString)), this, SIGNAL(btnClicked(QString)));
// ...
  • 接收者
// .h文件声明相应的槽函数
private slots:
    void onBtnClicked(const QString& text);

// .cpp文件连接发送者的信号和该槽函数
// ...
connect(ui->widgetTools, &Tools::btnClicked, this, &Main::onBtnClicked);

void Main::onBtnClicked(const QString &text)
{
    qDebug() << text;
    // 根据text然后进行判断调用相应的函数
}
// ...

获取信号发出者

// sender()
QPushButton* btn = dynamic_cast<QPushButton*>(sender());

断开连接

// bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
// 断开spinBox信号和槽的所有连接
disconnect(ui->spinBox, nullptr, nullptr, nullptr);
ui->spinBox->disconnect(nullptr, nullptr, nullptr);

// 断开spinBox的指定信号和槽的连接
disconnect(ui->spinBox, SIGNAL(valueChanged(int)), nullptr, nullptr);

// 断开接收者所有连接
ui->spinBox->disconnect(nullptr, ui->progressBar, nullptr);

// 断开接收者的某个槽函数连接
disconnect(ui->spinBox, nullptr, ui->progressBar, SLOT(setWindowTitle(QString)));

网络编程

获取本机IP地址

QString getLocalIP()
{
    // 获取本机主机名
    QString hostName = QHostInfo::localHostName();
    // 根据主机名获取主机信息
    QHostInfo hostInfo = QHostInfo::fromName(hostName);
    // 通过主机信息获取主机地址列表
    QList<QHostAddress> addrList = hostInfo.addresses();
    // 定义一个字符串用于存放主机IP
    QString localIp = "";
    if(!addrList.isEmpty())
    {
        // 遍历addrList
        for(int i = 0; i < addrList.count(); i++)
        {
            QHostAddress addr = addrList.at(i);
            // 判断如果是IPV4地址,就加到localIp字符串中
            if(addr.protocol() == QAbstractSocket::IPv4Protocol)
            {
                localIp += addr.toString() + " ";
            }
        }
    }
    return localIp;
}

文件相关

获取当前路径,并创建temp,并获取temp的绝对路径

// 获取当前路径
QString curPath = QDir::currentPath();
// 创建QDir对象
QDir dir(curPath);
// 创建temp文件夹
QString sub = "temp";
dir.mkdir(sub);
// 获取temp的绝对路径
QString tempPath = dir.absoluteFilePath(sub);

上传文件相关

// 上传,单个文件
QString path = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("上传"), "./");

// 上传,多个文件
QStringList pathList = QFileDialog::getOpenFileNames(this, QString::fromLocal8Bit("上传"), "./");

// 上传,指定类型文件
QStringList pathList = QFileDialog::getOpenFileNames(
    this,
    QString::fromLocal8Bit("上传"),
    "./",
    "hpp(*.h *.cpp);;MakeFile(*.Release *.Debug)"
    );

// 上传,文件夹
QString path = QFileDialog::getExistingDirectory(this, QString::fromLocal8Bit("上传"), "./");

下载文件

// 下载,文件
QString path = QFileDialog::getSaveFileName(this, QString::fromLocal8Bit("下载"), "./");

事件相关

处理事件-三种方法

  1. 安装事件过滤器
// 在父控件安装过滤器
ui->lineEdit->installEventFilter(this); // 让Widget捕获传递给lineEdit的事件

// 在.h文件中声明
bool eventFilter(QObject *watched, QEvent *event);

// 在.cpp中定义
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->lineEdit)
    {
        if(event->type() == QEvent::KeyPress)
        {
            qDebug() << "键盘按下事件";
        }
    }
    return QWidget::eventFilter(watched, event);
}
  1. 重写event方法
// .h文件中声明
bool event(QEvent* e);

// .cpp中定义
bool MyLineEdit::event(QEvent *e)
{
    if(e->type() == QEvent::KeyPress)
    {
        qDebug() << "键盘按下事件";
    }
    return QLineEdit::event(e);
}
  1. 重写事件处理方法
// .h中声明
void keyPressEvent(QKeyEvent* event);

// .cpp中定义
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "键盘按下事件";
    QLineEdit::keyPressEvent(event); // 执行父类的事件处理函数
    event->ignore(); // 事件传递给父类
}

事件传递顺序: 键盘按下,产生QKeyEvent --> eventFilter --> event --> KeyPressEvent --> …

部署工程

使用windeployqt部署

  1. 查找到windeployqt.exe程序(一般在qt安装目录的中)
  2. 将该程序所在路径添加到环境变量中
  3. 打开命令行,输入windeployqt.exe 项目的exe文件,回车即可

使用qtcreator部署

  1. 查找到windeployqt.exe程序(一般在qt安装目录的中)
  2. 将该程序所在路径添加到环境变量中
  3. 打开qtcreator,这里一定要先添加完环境变量再打开qtcreator
  4. 点击: 项目 --> Run --> 添加Deploy步骤 --> Command中输入windeployqt.exe --> Arguments中选择Executable:FilePath结尾的那个变量 --> 右击项目点击部署

学习记录

将枚举类型转换为字符串

  • 这里使用的在网络编程中,获取socket状态并显示的时候,遇到的一个问题
#include <QMetaEnum>

// 将枚举类型转换为字符串
QMetaEnum metaEnum = QMetaEnum::fromType<QAbstractSocket::SocketState>();
const char *c_str = metaEnum.valueToKey(socketState);
QString str = QString(c_str);

设置插入到QplainTextEdit中的文字样式

void MainWindow::InsertPlantText(QString text, int fontSize, QColor fontColor, QColor backColor)
{
    // 先保存当前的字符格式
    QTextCharFormat originFmt = ui->plainTextEdit->currentCharFormat();
    
    // 设置新的字符格式
    QTextCharFormat fmt;
    // 设置字体大小
    fmt.setFontPointSize(fontSize);
    // 设置字体色
    fmt.setForeground(QBrush(fontColor));
    // 设置背景色
    fmt.setBackground(QBrush(backColor));
    // 设置文本框格式
    ui->plainTextEdit->mergeCurrentCharFormat(fmt);
    //文本框添加文本
    ui->plainTextEdit->appendPlainText(text);

    // 设置回之前的字符格式
    ui->plainTextEdit->setCurrentCharFormat(originFmt);
}

读取、修改、写入json文件

#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>

// 读取json文件
QJsonObject read(const QString& path)
{
    QFile file(path);
    file.open(QIODevice::ReadOnly);
    QByteArray data = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(data);
    return doc.object();
}

// 写入json文件
void write(const QJsonObject& object, const QString& path)
{
    QFile file(path);
    file.open(QIODevice::WriteOnly);
    QJsonDocument doc(object);
    file.write(doc.toJson());
    file.close();
}

int main(int argc, char *argv[])
{
    // 读取json文件
    QJsonObject obj = read("C:/Users/bhlu/Desktop/study/qt/qt_project_study_1/QJson_example/read.json");
    qDebug() << obj;

    // 修改json内容
    obj["object"] = "this is object";

    // 写入json文件
    write(obj, "C:/Users/bhlu/Desktop/study/qt/qt_project_study_1/QJson_example/write.json");
}

单例模式

  1. 创建单例访问静态函数: static T::instance()
  2. 使用宏引用: Q_GLOBAL_STATIC(T, ins)
  3. 创建宏引用: #define MB T::instance()
// .h文件
#ifndef TEST_H
#define TEST_H

#define MB Test::instance() // 3

class Test : public QObject
{
    Q_OBJECT
public:
    explicit Test(QOBject *parent = nullptr);
    static Test* instance(); // 1
}

#endif // TEST_H

// .cpp文件
#include "test.h"
Q_GLOBAL_STATIC(Test, ins) // 2

Test::Test(QObject *parent)
    : QOBject{parent}
{
}

Test* Test::instance()
{
    return ins();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值