VS联合QT编程
一、配置VS2015和QT环境及新建项目
1.1 参考VS2015与Qt5.11配置
下图是建立的64bit的程序
1.2 在ui界面上添加如下控件
二、建立qt-designer与VS中代码的关系
1 在VS程序文件内创建槽函数,然后在qt-designer界面构建控件与槽函数的关联QT入门级小项目(vs2015+qt designer混合编程)
2 槽函数的创建和与信号的关联都采用VS中程序实现
在DialPlateShow64bit.h文件中添加如下代码:
#pragma once
#pragma execution_character_set("utf-8") //防止中文乱码
#include <QtWidgets/QMainWindow>
#include "ui_DialPlateShow64bit.h"
#include "dialplate.h"
class DialPlateShow64bit : public QMainWindow
{
Q_OBJECT
public:
DialPlateShow64bit(QWidget *parent = Q_NULLPTR);
~DialPlateShow64bit();
private:
Ui::DialPlateShow64bitClass ui;
private slots:
void sliderValueChanged(int);
void bigDiviValueChanged(int);
void bigDiviValueChanged(QString);
void smallDiviValueChanged(int);
void smallDiviValueChanged(QString);
void scaleValueChanged(int);
void scaleValueChanged(QString);
void on_btn_Init(void);
void on_btn_Init(bool isInit);
};
在DialPlateShow64bit.cpp文件中添加如下代码:
#include "DialPlateShow64bit.h"
#include<qstring.h>
DialPlateShow64bit::DialPlateShow64bit(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//不推荐使用:信号或者槽函数写错无法检测出来
//connect(ui.hSlider_value, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int)));
//connect(ui.hSlider_value, SIGNAL(valueChanged(QString)), this, SLOT(sliderValueChanged(QString)));
//推荐使用
connect(ui.hSlider_value, &QSlider::valueChanged, this, &DialPlateShow64bit::sliderValueChanged);
//遇到信号和槽函数重载
//1 采用实例化一个函数指针
void (QSpinBox::*spinIntSignal)(int) = &QSpinBox::valueChanged;
void (DialPlateShow64bit::*bigDiviIntSlot)(int) = &DialPlateShow64bit::bigDiviValueChanged;
connect(ui.spBx_bigDivi, spinIntSignal, this, bigDiviIntSlot);
void (QSpinBox::*spinQStringSignal)(const QString &) = &QSpinBox::valueChanged;
void (DialPlateShow64bit::*bigDiviQStringSlot)(QString) = &DialPlateShow64bit::bigDiviValueChanged;
connect(ui.spBx_bigDivi, spinQStringSignal, this, bigDiviQStringSlot);
//2 将信号强制转换为函数指针
connect(ui.spbx_smallDivi, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
this, static_cast<void (DialPlateShow64bit::*)(int)>(&DialPlateShow64bit::smallDiviValueChanged));
connect(ui.spbx_smallDivi, static_cast<void (QSpinBox::*)(const QString &)>(&QSpinBox::valueChanged),
this, static_cast<void (DialPlateShow64bit::*)(QString)>(&DialPlateShow64bit::smallDiviValueChanged));
connect(ui.spbx_scale, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
this, static_cast<void (DialPlateShow64bit::*)(int)>(&DialPlateShow64bit::scaleValueChanged));
connect(ui.spbx_scale, static_cast<void (QSpinBox::*)(const QString &)>(&QSpinBox::valueChanged),
this, static_cast<void (DialPlateShow64bit::*)(QString)>(&DialPlateShow64bit::scaleValueChanged));
//QPushButton的clicked信号其实不算重载信号,只是在定义该信号时添加了默认值
connect(ui.btn_Init, &QPushButton::clicked,
this, static_cast<void (DialPlateShow64bit::*)()>(&DialPlateShow64bit::on_btn_Init));
connect(ui.btn_Init, static_cast<void (QPushButton::*)(bool)>(&QPushButton::clicked),
this, static_cast<void (DialPlateShow64bit::*)(bool)>(&DialPlateShow64bit::on_btn_Init));
//以lambda表达式作为槽函数
connect(ui.btn_Exit, &QPushButton::clicked, [this](){this->close(); });
}
void DialPlateShow64bit::sliderValueChanged(int value)
{
ui.dialPlate->setValue(value);
ui.dialPlate->update();
}
DialPlateShow64bit::~DialPlateShow64bit()
{
}
void DialPlateShow64bit::bigDiviValueChanged(int bigDivi)
{
ui.dialPlate->setBigDivided(bigDivi);
ui.dialPlate->update();
}
void DialPlateShow64bit::bigDiviValueChanged(QString bigDivi)
{
ui.labl_bigDivi->setText(bigDivi);
ui.dialPlate->update();
}
void DialPlateShow64bit::smallDiviValueChanged(int smallDivi)
{
ui.dialPlate->setSmallDivided(smallDivi);
ui.dialPlate->update();
}
void DialPlateShow64bit::smallDiviValueChanged(QString smallDivi)
{
ui.labl_smallDivi->setText(smallDivi);
}
void DialPlateShow64bit::scaleValueChanged(int scale)
{
ui.dialPlate->setScale(scale);
ui.hSlider_value->setMaximum(10 * ui.spbx_scale->value());
ui.dialPlate->update();
}
void DialPlateShow64bit::scaleValueChanged(QString scale)
{
ui.labl_scale->setText("倍率 X" + scale);
}
void DialPlateShow64bit::on_btn_Init(void)
{
ui.spBx_bigDivi->setValue(10);
ui.spbx_smallDivi->setValue(10);
ui.spbx_scale->setValue(1);
}
void DialPlateShow64bit::on_btn_Init(bool isInit)
{
ui.labl_scale->setText("初始倍率");
}
程序中包含了QT5版本中信号和槽函数新的connect方式,以及采用这种方式出现信号或者槽函数重载的情况的解决办法,最后还利用了lambda作为槽函数。关于lambda可以参考C++ lambda表达式入门
三、生成可执行程序
将配置管理器改成Release,生成Release版本的可以执行文件。
打开安装QT时安装的MSVC1025,根据自己的程序选择32bit/64bit,
红色箭头指的是windeployqt,需要我们手动输入,蓝色箭头指的需要执行的程序的exe文件,可以复制进来或者直接点住鼠标拖进来,注意这两个箭头内容直接有一个空格。
按Enter后会自动执行。
最后Release文件夹内的文件就变这样了,点击exe文件程序就可以直接打开使用啦!