QT知识点

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"));
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值