QT学习笔记持续更新

2022.4.23

接下来的一段时间会对QT进行系统的学习,本文是对学习过程中一些代码和问题的总结,将会不间断的在本文中进行更新。

=========================================================================

创建一个按钮

Widget::Widget(QWidget *parent)
    : QWidget(parent)//初始化列表
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    btn->show();//show以顶层的方式弹出窗口控件

    //让btn对象 依赖在widget中
    btn->setParent(this);

    //显示文本
    btn->setText("第一个按钮");


    //创建第二个按钮 按照控件大小创建窗口
    QPushButton * btn2 = new QPushButton("第二个按钮",this);

    //移动btn2
    btn2->move(100,100);
    btn->move(20,20);

    //按钮重新指定大小
    btn2->resize(150,50);

    //重置窗口的大小
    resize(600,400);

    //设置固定窗口大小
    setFixedSize(600,400);

    //设置窗口标题
    setWindowTitle("邸猪猪窗口");

}

这是在widget.cpp中的代码,具体有关创建按钮的函数可参考代码段。

                                                                                                                                        2022.4.23

=========================================================================

对象树

当创建的对象在堆区时,涉及到堆区内存释放的问题,在QT中有着对象树这样的概念,可以简化内存释放的操作,当你的对象在堆区同时设置有父类,这样系统会自动把你的对象放在对象树中,当释放父对象时,子对象同时会被一起释放,释放顺序为先释放子对象,后释放父对象(但打印顺序与这个相反这个需要注意一下)。

                                                                                                                                        2022.4.23

=========================================================================

信号和槽

这个知识点比较关键可以体现为以下代码:

    //需求 点击我的按钮 关闭窗口
    //参数1 信号的发送者 参数二 发送的信号 参数三 信号的接收者 参数四 信号的处理者
    connect(mybtn , &QPushButton::clicked,this,&QPushButton::close);

这个connect将这写不相干的东西链接了起来,最后能够实现该需求,代码直接看就能懂

                                                                                                                                        2022.4.23

=========================================================================

自定义的信号和槽

1.自定义信号

        返回void

        需要声明,不需要实现(在.h文件中的signals下)

        可以有参数,可以重载

2.自定义槽函数

        返回void

        需要声明,也需要实现(在.h文件中的public下)

        可以有参数,可以重载

void Widget :: ClassIsOver()
{
    //下课函数,调用后 触发老师饿了的信号
    emit chn->hungry();
}

这里的emit关键字是用来触发信号的

                                                                                                                                        2022.4.23

=========================================================================

自定义信号和槽重载的解决

当自定义信号和槽发生函数重载时,如下:

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

//学生的槽
public:
    explicit Student(QObject *parent = nullptr);
    //槽函数可以写在public下
    //返回值void,需要声明也需要实现
    //可以有参数,可以发生重载
    void treat();
    void treat(QString foodname);

如果在Widget 的构造函数中还像上一节一样直接调用hungry,那么编译器会无法识别具体是哪一个,因此,在这里应该使用函数指针来具体指向你想要调用的函数。

/*在出现函数重载的现象时,我们需要用函数指针来指向函数的地址,这样编
*译器才能识别出来你具体想要调用哪个函数
*/
void (Teacher::*tercherSignals)(QString)=&Teacher::hungry;
void (Student::*studentSlot)(QString)=&Student::treat;

connect(chn,tercherSignals,dsq,studentSlot);
//调用下课函数
ClassIsOver();

注意:在定义函数指针的时候前面一定要写作用域。

运行结果:请老师吃饭,吃 "宫保鸡丁"

这时,如果我们想去掉双引号,就可以执行下面的操作。

//QString->char*先转QByteArray(.toUtf8())再转char*
qDebug()<<"请老师吃饭,吃"<

运行结果:请老师吃饭,吃 宫保鸡丁

                                                                                                                                        2022.4.24

=========================================================================

信号连接信号等

信号不光可以与槽连接,也可以与信号连接,可以用一个信号来触发另一个信号,但是信号不能带参数。

同时也可以实现断开连接使用disconnect函数,使用方法与connect一致。

                                                                                                                                        2022.4.24

=========================================================================

 Lambda表达式

QT学习笔记持续更新_第1张图片

QT学习笔记持续更新_第2张图片

 一般等号就够了

 

                                                                                                                                      2022.4.24

=========================================================================

QMainWindow菜单栏和工具栏

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //重置窗口大小
    resize(600,400);

    //菜单栏的创建  只能最多有一个
    QMenuBar * bar = menuBar();

    //将菜单栏放入窗口中
    setMenuBar(bar);

    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * editMenu = bar->addMenu("编辑");

    //创建菜单项
    QAction *newAddaction = fileMenu->addAction("新建");
    //添加分隔符
    fileMenu->addSeparator();
    QAction *openAddaction = fileMenu->addAction("打开");
    fileMenu->addAction("另存为");
    fileMenu->addAction("打印");

    //工具栏  可以有多个
    QToolBar * toolBar = new QToolBar(this);
    //不仅仅在堆上开辟了空间,而且调用了QToolBar的构造函数
    addToolBar(Qt::LeftToolBarArea,toolBar);

    //后期设置只允许左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);

    //设置浮动
    toolBar->setFloatable(false);

    //设置移动(总开关)
    toolBar->setMovable(false);

    //工具栏中可以设置内容
    toolBar->addAction(newAddaction);
    toolBar->addSeparator();
    toolBar->addAction(openAddaction);

    //工具栏中添加控件
    QPushButton * btn = new QPushButton("aa",this);
    toolBar->addWidget(btn);
}

                                                                                                                                      2022.4.25

=========================================================================

状态栏、铆接部件(浮动窗口)、核心部件

    //状态栏最多有一个
    QStatusBar * stBar = statusBar();

    //设置到窗口中
    setStatusBar(stBar);//只能有一个用set,可以有多个用add

    //放标签控件
    QLabel * label = new QLabel("温度",this);
    stBar->addWidget(label);//左侧提示
    stBar->addPermanentWidget(label);//右侧提示

    //铆接部件(浮动窗口)可以有多个
    QDockWidget * dockWidget = new QDockWidget("浮动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
    //设置后期停靠区域,只允许上下
    dockWidget->setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);

    //设置中心部件
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);

状态栏和中心部件最多有一个,浮动窗口可以有多个,单个用set,多个用add。

                                                                                                                                      2022.4.25

=========================================================================

你可能感兴趣的:(QT,c++)