1.QEvent与QMouseEvent之间转换
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
2.QT鼠标在窗口Move
qt默认的MouseMove事件是要在鼠标左键按下才触发,要想鼠标左键不按下,滑动到上面就触发,需要在构造函数里加入,这个好像只对Widge有效,如果是MainWindow没效果,还是鼠标按下之后才有mousemove事件
setMouseTracking(true);
3.子窗体层次问题
建立了两个窗口,父窗口里打开子窗口,子窗口执行完相关动作后会close子窗体,遇到的问题是子窗体调用close关闭自己时,父窗体会显示层级会下沉一级,即子窗体关闭后父窗体会隐藏在当前其他软件的下面,但是点窗体的x关闭时就不会有这现象,试了父窗体raise(),show(),activatewindow(),等都没效果,最终发现在show 子窗体前设置置顶属性就好了,但是这种情况下子窗体会处于全局置顶的情况
matchsetform->setWindowFlags(Qt::WindowStaysOnTopHint);
4.字符串拼接
QString i;
QString total;
QString fileName;
QString status = QString("Processing file %1 of %2: %3")
.arg(i).arg(total).arg(fileName);
5.静态链接库/动态链接库
Linux/Unix 系统里静态库扩展名一般是 .a,动态库扩展名一般是 .so 。Windows 系统里 VC 编译器用的静态库扩展名一般是 .lib,动态库扩展名一般是 .dll
MinGW 比较特殊,是将 GNU 工具集和链接库从 Linux/Unix 系统移植到 Windows 里, 有意思的情况就出现了,MinGW 使用的静态库扩展名为 .a ,而其动态库扩展名则为 .dll, .a 仅在生成目标程序过程中使用,.dll 则是在目标程序运行时使用。
6.未找到MainWindow.obj
有时候在QT添加新C++资源文件后,会报未找到mainwindow.obj的错误,需要先执行下qmake,然后再运行,建了新文件后编译运行后再删除,也会报错,先把Debug文件夹里自动生成的文件都删除,然后再qmake,运行
7.路径
"./api.txt"的路径是…build-qtHalcon1-Desktop_Qt_5_12_0_MSVC2017_64bit-Debug
QDir dir;
currentPath = dir.currentPath();
//获取项目文件夹路径
8.小函数
//memset可以方便的清空一个结构类型的变量或数组
memset(m_reserved,0, 6); // 6byte
//extern void *memcpy(void *dest, void *src, unsigned int count);由src所指内存区域复制count个字节到dest所指内存区域
memcpy(m_data, data, size);
//告诉编译器未使用,清除编译器警告
Q_UNUSED(checked)
9 QT中报错collect2:ld returned 1 exit status的可能原因。
遇到的原因是在.h文件里定义了类,也有构造函数,但是在.cpp实现时没有定义构造函数的实现,导致报错
10.调试信息
#define SCDebug qDebug() <<"[Debug]["<<__FILE__<<"]$"<<0<<"$"<<"["<<__LINE__<<"]["<<__FUNCTION__ <<"]:"
#define SCInfo qInfo() <<"[Info]["<<__FILE__<<"]$"<<0<<"$"<<"["<<__LINE__<<"]["<<__FUNCTION__<<"]:"
#define SCWarning qWarning()<<"[Warning][" <<__FILE__<<"]$"<<0<<"$"<<"["<<__LINE__<<"]["<<__FUNCTION__<<"]:"
#define SCritical qCritical() <<"[Error]["<<__FILE__<<"]$"<<0<<"$"<<"["<<__LINE__<<"]["<<__FUNCTION__<<"]:"
10.emit信号时报错
undefined reference to `TcpClient::test()’
自定义的类集成于QObject,要注意引入#include<QObject>
,同时在定义Q_OBJECT
11.QT this->parent
通过构造函数的时候传入this,可以在被new 的函数里使用调用new的类里面的函数
12 : error: undefined reference to `AGVS::~AGVS()’
父类定义了纯虚析构函数,要在cpp里实现
13: error: expected “FILENAME” or
在QT中引用其他库文件时,路径的分隔符要正确
INCLUDEPATH += D:\person\Project\DLL\boost_1_73_0
14.QT项目中添加子项目
想要弄成如上的i项目结构,发现直接右击按钮为灰色
修改.pro文件完成
QT += core gui network
#QT += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = comtool
TEMPLATE = app
DESTDIR = $$PWD/../bin
RC_FILE = other/main.rc
SOURCES += main.cpp
HEADERS += \
head.h
RESOURCES += other/main.qrc
CONFIG += warn_off
INCLUDEPATH += $$PWD
INCLUDEPATH += $$PWD/api
INCLUDEPATH += $$PWD/form
#INCLUDEPATH += $$PWD/qextserialport
INCLUDEPATH += $$PWD/qextserialport_new
include ($$PWD/api/api.pri)
include ($$PWD/form/form.pri)
#include ($$PWD/qextserialport/qextserialport.pri)
include ($$PWD/qextserialport_new/qextserialport.pri)
unix {
contains(arma7, DEFINES) {
INCLUDEPATH += /usr/local/openssl-1.0.2m-h3-gcc-4.9.2/include
LIBS += -L/usr/local/openssl-1.0.2m-h3-gcc-4.9.2/lib -lssl -lcrypto
LIBS += -L/usr/local/h3_rootfsv -lXdmcp
}
}
15.QT生成独立EXE文件
通过QT creator生成的exe文件,不管是debug或release模式下,直接拷贝到其他电脑可能不能正常使用,此时需要使用windeployqt打包工具了,发布的时候先生成release版的,再打包
1.建立一个存放打包后的文件夹,将release模式下生成的exe文件拷贝进去(这个exe直接运行会报错)。
2.使用qt creator带的软件
d3dcompiler_XX.dll测试也可以删除
16.Qt使Release版本可调试
只需在pro文件中加入
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
17. QT乱码
在.pro文件上加入
QMAKE_CXXFLAGS += /utf-8
18. QT tableWidget设置样式
QTableView
{
background-color: rgba(255, 255, 255, 0);
alternate-background-color:#e3edf9;
font:14px "微软雅黑";
color:#677483;
gridline-color: #ccddf0;
}
QTableView::item
{
font:14px "微软雅黑";
color:#677483;
gridline-color: #ccddf0;
}
QTableView::item:selected
{
color:#677483;
}
QHeaderView::section {
color: black;
font:bold 14px "微软雅黑";
text-align:center;
height:32px;
background-color: #d1dff0;
border:1px solid #8faac9;
border-left:none;
}
// border-left:none;防止中间表头的border重叠
QHeaderView::section:first
{
border-left:1px solid #8faac9;
}
19 .QT-继承QWidget 设置样式无效解决
自己编写了一个类继承QWidget,发现无法设置样式
void myWidget::paintEvent(QPaintEvent *event)
{
QStylePainter painter(this);
//用style画背景 (会使用setstylesheet中的内容)
QStyleOption opt;
opt.initFrom(this);
opt.rect=rect();
painter.drawPrimitive(QStyle::PE_Widget, opt);
QWidget::paintEvent(event);
}
20.设置QGroupBox的边框样式后,title下沉
样式:
QGroupBox{
border: 2px solid "#DCE4EC";
border-radius:3px;
margin-top:6px;
}
QGroupBox:title
{
subcontrol-origin: margin;
left: 10px;
}
主要起作用的是QGroupBox的margin-top,让groupbox下沉
21.小时差和日期差
//小时差
QDateTime currentTime = QDateTime::currentDateTime();
QString endTime = currentTime.toString("yyyy-MM-dd hh:mm:ss");
//获取前一小时
//QString startTime = QDateTime::fromSecsSinceEpoch(currentTime.toSecsSinceEpoch()-60*60).toString("yyyy-MM-dd hh:mm:ss");
//获取前一天时间
QString startTime=currentTime.addDays(-1).toString("yyyy-MM-dd hh:mm:ss");
22. 移除/添加样式
//移除原有样式
style()->unpolish(ui->btn);
//重新设置新的该控件的样式。
style()->polish(ui->btn);
23 获取类的属性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; ++i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = object->property(name);
qDebug() << name << value;
}
24. char* 转 QString乱码问题
在网络传输中,char* 数据通过 QString构造函数直接转会乱码
//中文乱码问题
QTextCodec* codec = QTextCodec::codecForName("GBK");//指定QString的编码方式
QString res = codec->toUnicode(tmp);//con可以是char*,可以是QByteArray。
std::string 转QString,再转 QByteArray时,选择 fromutf8()和toutf8(),选择tolocalbit 也可能会乱码
std::map<QString, QString> res1 = JsonParse::JsonToString(QString::fromUtf8(res->body.data()).toUtf8());
换了个文件编写,又乱码。。。
std::map<QString, QString> res1 = JsonParse::JsonToString(QString(QString::fromLocal8Bit(res->body.c_str())).toUtf8());
又乱码。。
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
在开头加入这个,后面都用 fromutf8和toutf8
25. include的坑
利用 QTcp相关编写了一个类库文件,直接在 pro文件里引用 INCLUDEPATH +=$$PWD/…/…/include,会报错,error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall,必须通过右击,添加现有文件才可以
26. QTableWidget
解决 tableWidget 表头的下边框线不显示的问题
在 main函数里加入
QApplication::setStyle(QStyleFactory::create("Fusion"));