c++/Qt学习笔记

1.基础知识

1.main.cpp

#include "widget.h"

#include <QApplication>


//argc命令行变量的数量  argv命令行变量的数组
int main(int argc, char *argv[])
{
    //应用程序对象,有且只能有一个
    QApplication a(argc, argv);

    //窗口对象  Qwidget是Qmainwindow和Qdialog的父类
    Widget w;
    w.show();
    //应用程序对象进行死循环,内部是一个消息循环机制
    //代码阻塞到这一行,之后的程序不进行运行。
    return a.exec();
}
//svn代码合并a,b实现合并

2. .pro文件解释

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets//大于版本4以上,包含widget模块

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

3.命名规范和快捷键

1.类名 首字母大写,单词与单词之间首字母大写

2.函数名 变量名称 首字母小写 单词与单词之间首字母大写

3.快捷键

注释 ctrl+/

运行 ctrl+r

编译 ctrl+b

查找 ctrl+f

4.常见错误

1、error: ‘header’ was not declared in this scope

在使用此变量之前没有对其进行定义

2、error - RtlWerpReportException failed with status code :-1073741823

这个错误多半是因为一个变量定义好后还没有被初始化,在内存中还没有分配空间,就被拿来使用了。或者一些多线陈里或者文件.h定义先后顺序的问题,检查变量被使用前是否已经初始化和分配空间

3、QMetaObject::connectSlotsByName: No matching signal for on_xxxxx()

对结果没有影响,程序不会出现错误。
Qt中空间名称关联槽的方式进行关联,对应的函数必须写成"on_控件名_信号名"的格式;或者也可以通过connet函数人为显式地将信号和槽关联起来。但是,如果采用显式connect的方法的同时,又将槽函数的名字起成了“on_控件名_信号名”的格式,那么就会在运行时弹出警告.为了消除“对于……没有匹配信号”的警告,我们需要遵循这个命名约定,或者确保我们的槽名都不是以“on_”开头的。

4、error: multiple definition of `menu::menu(QWidget*)’

在.h文件中声明各种类以后,在使用这些类的.cpp文件的开头对这些.h文件进行了声明。若在delete.h文件的开头声明了另一个menu.h文件,即两个文件有了嵌套关系,这时在delete.cpp文件中就不需要再对menu.h进行声明了,否则会出现上方重复定义的错误。也可以打开QT工程文件*.pro,查看SOURCES += \ 以及 HEADERS += \下方是否有重复的源文件名或头文件名,删掉重复。

5、error: ‘setCodecForTr’ is not a member of ‘QTextCodec’

在QT5中,不支持QTextCodec,直接删除这句话。

6、error: ‘UnicodeUTF8’ is not a member of ‘QApplication’

apply(“emergency_call”, “Form”, 0, UnicodeUTF8) 修改为:
apply(“emergency_call”, “Form”, 0)

7、error: ‘class QHeaderView’ has no member named ‘setResizeMode’

将 setResizeMode 替换为为 setSectionResizeMode

8、error: undefined reference to `zero::on_export_menu()’

出现此问题的原因是,在.h文件中对on_export_menu()槽进行了声明,但是并没有在.cpp文件中对其进行定义。可以尝试删除.h文件中的声明或对其进行定义。

9、error: ld returned 1 exit status

解决方案是将保存路径下的build-xxxxx-Desktop…文件夹删除,切记是build…文件,删除后重新编译运行程序会再次生成build文件。

10.路径不可带有中文,而且程序也是中文敏感。

5.按钮控件

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{//创建一个按钮
    QPushButton * btn =new QPushButton;//使用某个类的时候,需要提前添加头文件才可以使用
    btn->show();//show函数以顶层的方式弹出窗口控件
    btn->setParent(this);
    btn->setText("第一个按钮");
//    btn->

    QPushButton * btn2 =new QPushButton("第二个按钮",this);
    btn2->show();
//    resize(600,400);
    btn2->move(100,100);
//设置标题
    setWindowTitle("1111");
    setFixedSize(1000,618);


    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;

}

1.创建

 QPushButton * btn =new QPushButton

2.设置父类

btn->setParent(this)

3.设置文本

btn->setText("第一个按钮")

4.设置位置

btn2->move(100,100)

5.重新制定窗口大小

resize(600,400)     //测试无用
setFixedSize(1000,618)  //测试有用   固定大小,不可拉伸

6.设置窗口标题

setWindowTitle("1111")  //无法设定

7.比较两种创建方式

 QPushButton * btn =new QPushButton;//使用某个类的时候,需要提前添加头文件才可以使用
 btn->show();//show函数以顶层的方式弹出窗口控件
 btn->setParent(this);
 btn->setText("第一个按钮");
    
    
 QPushButton * btn2 =new QPushButton("第二个按钮",this);
 btn2->resize(100,100);
 btn2->move(100,100);

6.对象树

当创建的对象在堆区的时候,如果指定的父亲是QObect派生或者QObect子类派生下来的类,可以不用管理释放的操作。

2.信号和槽机制

1.信号与槽

1.连接函数 connect()

2.参数

参数1 信号的发送者; 参数2 发送的信号; 参数3 信号的接收者 ;参数4 处理的槽函数

3.松散耦合

4.信号和槽如果在子类中没有找到,可以去帮助文档里面寻找父类的signal 和 slot

以下两种交叉使用也是可以的。

connect(myBtn,&QPushButton ::clicked,this,&QWidget::close);
//&传入的是地址

 connect(myBtn,&MyPushButton ::clicked,this,&Widget::close);

//第二种从左到右分别是  按钮对象 按钮对应函数地址   this(指当前类的对象) 当前类槽函数的地址  

2.自定义的信号和槽

自定义的响应类 student.h

//早期的版本qt 必须要写到public slots下,5.4之后,可以写到public或者全局下
    //返回值 void ,需要声明,也需要实现
    //可以有参数,可以发生重载
public:
    void treat();//如果只是在信号下进行声明,会在moc_student文件内部也有一个空的实现,发生重定义错误。所以要注意声明的位置。

自定义的信号发出类 teacher.h

signals:
    //自定义的信号  写到signals下
    //返回值是void,只需要声明,不需要实现
    //可以有参数,也可以重载
    void hungry();

可以观察到信号一般先在头文件中声明,然后在.cpp源文件中加上作用域进行实现。

widget.h

#include "teacher.h"
#include "student.h"


private:
    Ui::Widget *ui;
    Teacher * zt;//

    Student * st;//
    void classIsOver();

1.因为widget类使用了teacher和student两个类。所以需要先在头文件中加入对应类的头文件

2.创建对象的时候,会在相应的widget的私有属性中创建指针。

3.自己写的信号发出函数,也需要在头文件中声明。只有私有的函数成员才可以调用私有的成员属性,所以才写在private中。

widget.cpp

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值