目录:
前提:
因为需求,老的工具虽然很全面,但是不适合我要求,我需要做个新的工具(配牌)来加快效率,又要练习c++,在c++众多gui库中选择qt,只是为了上手便捷,而且文档很详细(应该说我目前见过文档中最详细和方便的),在做这个项目遇到了一些问题,记录以便以后查阅
qt环境:
问题:
1. 中文显示
遇到的情况:
- 动态显示按钮的中文名称
解决方式:
ui->lineEdit->setText(QString(u8"中文"));
//注:要在 .pro 文件中 添加 CONFIG += C++11
2. QString 与 string 的 转换
遇到的情况:
- 有些功能(例如解析)是在vs2017上写完,qt要调用这里cpp,其中会涉及到转换
(添加.cpp,.h 文件 直接加到工程目录后,在qt creator 中添加现有项就行)
解决方式:
//不适合有中文
string s = "hello";
string ss = "中文";
QString str = s.toStdString();
string sss = QString::fromStdString(s);
//要有中文
QString zStr = QString::fromLocal8Bit(ss.data());
QByteArray cData = zStr.toLocal8Bit();
string zS = string(cData);
3. 自定义信号参数
遇到的情况:
- 在信号发送时,顺便可以传送一些基本类型参数,对于模板,更复杂的数据类型就不能处理,比如 vector< unsigned char > 或 自定义的类,而我需要第二个窗口给第一个窗口传递设置好的牌等数据
解决方式:
用#include< QMetaType> 声明 注册 信号类型
- 目录结构
- UI窗口
3.代码
button.h
#ifndef BUTTON_H
#define BUTTON_H
#include <QPushButton>
#include <QMetaType>
#include <vector>
class Button : public QPushButton
{
Q_OBJECT
public:
explicit Button(QWidget *parent = nullptr);
signals:
void MySignal(std::vector<unsigned char>);
public slots:
void SendMySignal();
};
Q_DECLARE_METATYPE(std::vector<unsigned char>) //声明需要注册的类型
#endif // BUTTON_H
button.cpp
#include "button.h"
using namespace std;
Button::Button(QWidget *parent) : QPushButton(parent)
{
connect(this,&QPushButton::clicked,this,&Button::SendMySignal);
}
void Button::SendMySignal()
{
vector<unsigned char> a;
a.push_back(1);
emit MySignal(a);
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "button.h"
#include <vector>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void DealMySignal(std::vector<unsigned char> d);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton,&Button::MySignal,this,&MainWindow::DealMySignal);
}
void MainWindow::DealMySignal(vector<unsigned char> d)
{
qDebug()<<d.at(0);
}
MainWindow::~MainWindow()
{
delete ui;
}
4.显示效果(点击收到消息)
4. Qt 中的 调试
遇到的情况:
- 安装完Qt后,有调试按钮,但是其实并不能调试
弹出
解决方式:
下载CDB,并且添加到 构建套件 中
安装
Qt设置
选择 构造套件,我用的是vs2017 所以选择vs2017
点击进入,发现调试器是空的
添加调试器
我电脑是x64,所以选择x64的,然后应用
在回到构建套件中,设置调试器到CDB
点击apply,ok,开始调试,注意要在Debug下
5. Qt 中 模块计算机类型“X86”与目标计算机类型“x64”
遇到的情况:
- 在设置debug时,应该是不小心点错了,出现了这个错误
解决方式:
发现这两个不一样,改为一样,错误消失