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 | 快速切换变量和函数 |
F4 | cpp和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"));
RC_ICONS += wx.ico
信号和槽
使用QSignalMapper匹配信号发送
- 这里以QPushButton的按钮文本内容为例
- 发送者
#include <QSignalMapper>
signals:
void btnClicked(const QString& text);
QSignalMapper* mapper = new QSignalMapper(this);
QList<QPushButton*> btnList = findChildren<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)));
private slots:
void onBtnClicked(const QString& text);
connect(ui->widgetTools, &Tools::btnClicked, this, &Main::onBtnClicked);
void Main::onBtnClicked(const QString &text)
{
qDebug() << text;
}
获取信号发出者
QPushButton* btn = dynamic_cast<QPushButton*>(sender());
断开连接
disconnect(ui->spinBox, nullptr, nullptr, nullptr);
ui->spinBox->disconnect(nullptr, nullptr, nullptr);
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();
QString localIp = "";
if(!addrList.isEmpty())
{
for(int i = 0; i < addrList.count(); i++)
{
QHostAddress addr = addrList.at(i);
if(addr.protocol() == QAbstractSocket::IPv4Protocol)
{
localIp += addr.toString() + " ";
}
}
}
return localIp;
}
文件相关
获取当前路径,并创建temp,并获取temp的绝对路径
QString curPath = QDir::currentPath();
QDir dir(curPath);
QString sub = "temp";
dir.mkdir(sub);
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("下载"), "./");
事件相关
处理事件-三种方法
- 安装事件过滤器
ui->lineEdit->installEventFilter(this);
bool eventFilter(QObject *watched, QEvent *event);
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->lineEdit)
{
if(event->type() == QEvent::KeyPress)
{
qDebug() << "键盘按下事件";
}
}
return QWidget::eventFilter(watched, event);
}
- 重写event方法
bool event(QEvent* e);
bool MyLineEdit::event(QEvent *e)
{
if(e->type() == QEvent::KeyPress)
{
qDebug() << "键盘按下事件";
}
return QLineEdit::event(e);
}
- 重写事件处理方法
void keyPressEvent(QKeyEvent* event);
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug() << "键盘按下事件";
QLineEdit::keyPressEvent(event);
event->ignore();
}
事件传递顺序: 键盘按下,产生QKeyEvent --> eventFilter --> event --> KeyPressEvent --> …
部署工程
使用windeployqt部署
- 查找到
windeployqt.exe
程序(一般在qt安装目录的中) - 将该程序所在路径添加到环境变量中
- 打开命令行,输入
windeployqt.exe 项目的exe文件
,回车即可
使用qtcreator部署
- 查找到
windeployqt.exe
程序(一般在qt安装目录的中) - 将该程序所在路径添加到环境变量中
- 打开qtcreator,这里一定要先添加完环境变量再打开qtcreator
- 点击: 项目 --> 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>
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();
}
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[])
{
QJsonObject obj = read("C:/Users/bhlu/Desktop/study/qt/qt_project_study_1/QJson_example/read.json");
qDebug() << obj;
obj["object"] = "this is object";
write(obj, "C:/Users/bhlu/Desktop/study/qt/qt_project_study_1/QJson_example/write.json");
}
单例模式
- 创建单例访问静态函数:
static T::instance()
- 使用宏引用:
Q_GLOBAL_STATIC(T, ins)
- 创建宏引用:
#define MB T::instance()
#ifndef TEST_H
#define TEST_H
#define MB Test::instance()
class Test : public QObject
{
Q_OBJECT
public:
explicit Test(QOBject *parent = nullptr);
static Test* instance();
}
#endif
#include "test.h"
Q_GLOBAL_STATIC(Test, ins)
Test::Test(QObject *parent)
: QOBject{parent}
{
}
Test* Test::instance()
{
return ins();
}