前面我们在vc中成功使用了Qt原生控件QMessageBox, 如何使用非原生控件呢,例如我们从QDialog继承一个类,这里qmake没起到元对象的转化功能,怎么办呢?
我们接着在前一章的工程中开发。
1.手动编写一个EdbParamaUi 继承QDialog
#include <QtWidgets/QDialog>
#include <QtCore/QObject>
class EdbParamaUi : public QDialog
{
Q_OBJECT
public:
EdbParamaUi(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
~EdbParamaUi();
EdbParamaUi(const EdbParamaUi &){}
};
这里一定要将EdbParamaUi(const EdbParamaUi &){}公有化写出,在我的VS2013上报错。
源文件也非常简单
#include "stdafx.h"
#include "EdbParamaUi.h"
EdbParamaUi::EdbParamaUi(QWidget *parent, Qt::WindowFlags f) :QDialog(parent, f)
{
setWindowTitle(QStringLiteral("这是Qt对话框"));
}
EdbParamaUi::~EdbParamaUi()
{
}
接下来修改代码为:
void CMFCApplication4Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//QMessageBox::information(NULL, QStringLiteral("这是Qt消息框"), QStringLiteral("这是Qt消息框"));
EdbParamaUi ui;
ui.exec();
}
运行出现:
我们看到无法连接到元对象,Qt的元对象转换是通过moc来转化的,所以我们可以手动的生成:
1.打开cmd
2.进入Qt安装目录(如果写入了环境变量就不用)
C:\Qt\Qt5.6.0\5.6\msvc2013\bin
3. 元对象文件生成
只需要头文件即可 将目标文件改为Qt固定的格式 moc_文件名.cpp即可,这样工程中就多了一个前缀为moc_的文件
我们需要将这个文件加入到工程,项目右键-》添加-》现有项-》文件
4. 重新运行
出现这个 是因为使用了预编译而文件又没有包含预编译头文件stdafx.h, 解决方法是在所有头文件中都添加#include<stdafx.h> 或者在项目配置中不使用预编译。
再次运行 点击按钮
已经成功运行。
注:元对象文件除了手动生成 还可以通过QtCreator去将界面设计好并生成moc文件 然后拷贝到自己的工程,添加到项目中,这种方法非常简单,本人也使用此方法。
下章将Qt UI封装在dll中供其他语言调用,dll是二进制级别的文件 所以与语言无关,是较好的设计方案。