1、qtcreator项目和vs项目转换:
关于vs
的安装,我电脑里已经装了好几个版本的vs
了,不想再装了,可以参考这里:vs2015安装。
配置vs
的qt
环境可以参考这里:qt环境。
qt
和vs
项目的转换我发现已经有现成的工具了,下面采取Qt vs Tools
来转换项目。
(1)安装Qt vs Tools:
下载vs
中的qt
插件,从清华镜像下载速度快一些:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/vsaddin/
选好插件版本后,一定要按照自己的msvc
版本下载。下载完按照指示安装,它会自动添加到vs
中去的。重新打开vs
就可以在菜单栏看到Qt vs Tools
的菜单了。
(2)qtcreator项目转vs:
使用Qt vs Tools
中的Open Qt Project File(.pro)
打开Qt
项目的.pro
文件,就能完成Qt
项目的导入了。直接导入可能会有一些链接库路径问题导致的报错,就需要自己手动修正。
导入后,会在项目中生成一些vs
的文件,但是好像并不影响再用Qt creator
来打开项目。
(3)vs转qtcreator:
在vs
右侧选中项目,点击Qt vs Tools
中的create Basic .pro File
。
然后会出现导出项目的选项:
左侧生成.pri
文件和创建完打开创建的文件两个选项可选可不选。右边的project tag
,下拉会有很多选项,一开始我以为需要一个一个去设置,后来发现也是可以不选的,直接点OK
,然后.pro
文件就会生成了。
然后使用qtcreaor
打开这个.pro
文件,转换后的项目第一次会让你选择kits
,最好选择和vs
一样版本的msvc
吧,用mingw
打开会怎样我没试过。
注
:
有些项目在没有得到良好的配置情况下,就导致Qt vs Tools
无法将它识别为Qt
项目,然后按钮灰色无法生成.pro
文件。
(4)注:
直接在两个软件之间的转换以后进行编译和运行可能会报一些错,多半是一些链接库的路径问题。尤其是多机之间项目转换,由于环境变量不同,就可能找不到某些使用的dll
和library
,就需要自己手动修改环境变量或路径。不过可以通过把使用到的链接库一起拷贝过来,然后项目中的一些路径都使用相对路径来解决。
其余遇到的问题可以参考:https://blog.csdn.net/zyhse/article/details/105391291
2、qt项目在xp系统运行:
需要使用32位
也就是x86
版本的msvc
或mingw
,QtCreator
版本建议选择版本较低的。
我的方案是直接下载Qt5.6.3
,下载地址:https://download.qt.io/new_archive/qt/5.6/5.6.3/
比如是vs2015
,所以我可以下载下面两个版本kits
的Qt
下载:
要下载其他版本的,就把这个下载地址后面的版本去掉。
如果是下载mingw
版本,则可以直接使用,编译并打包完,就可以拿到xp
上运行了。但是考虑到有些链接库是不支持mingw
的,比如halcon
,就只能使用msvc
了。如果使用msvc
的话,还需要在.pro
文件中添加下面的代码:
win32 {
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
DEFINES += _ATL_XP_TARGETING
QMAKE_CFLAGS += /D_USING_V140_SDK71_
QMAKE_CXXFLAGS += /D_USING_V140_SDK71
LIBS *= -L"%ProgramFiles(x86)%/Microsoft SDKs/Windows/7.1A/Lib"
INCLUDEPATH += "%ProgramFiles(x86)%/Microsoft SDKs/Windows/7.1A/Include"
#QMAKE_TARGET_OS = xp
}
这段代码来自:https://www.jianshu.com/p/b954f57f1478
在xp
上运行:
3、提升控件的class:
以前一直不知道这个提升为
是干嘛的,后来发现可以使用提升为来对控件类进行自定义。
做个演示
首先在项目中创建一个class
,名字text
。
在text.h
中添加其基类为QLabel
:
#pragma once
#include <QLabel>
#include <QMouseEvent>
#include <QDebug>
class text : public QLabel
{
Q_OBJECT
public:
explicit text(QWidget *parent = NULL);
~text();
protected:
virtual void enterEvent(QEvent *e);
virtual void leaveEvent(QEvent *e);
};
在text.cpp
中添加鼠标事件和属性:
#include "text.h"
text::text(QWidget *parent)
:QLabel(parent)
{
this->setStyleSheet("background-color:rgb(255,0,255);");
}
text::~text()
{}
void text::enterEvent(QEvent *e)
{
qDebug()<<u8"鼠标移入";
}
void text::leaveEvent(QEvent *e)
{
qDebug()<<u8"鼠标移出";
}
在ui
中添加一个QPushButton
,然后右击这个button
,选择提升为:
这里基类可以理解为该提升为的类
能作用的控件类,提升的类名称和其所包含的头文件按照刚刚创建的创建的类来写。全局包含决定#include
是<>
添加,还是""
添加。
可以点击添加,之后再右击pushbutton
将其提升为text
,提升完成后,这个按钮就会变成class
名为text
的label
了。再右击可以选择取消提升。
运行后:
刚才设置的背景颜色和enter
和release
事件就作用于pushbutton
了,同时,它变成了一个label
。
打开ui_mainwindow.h
可以看到,提升为实际就是从:
变成了:
同时,可以看到,由于之前勾选了全局包含,所以这里引入text
类的方式是<>
:
去掉勾选,并重新构建,然后打开ui_mainwindow.ui
,就发现引入方式变成""
了:
直接使用记事本打开ui
文件,然后修改class
好像也能达到这样的效果,但是似乎会引起一些未知的错误,所以不推荐了。