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
=========================================================================
一般等号就够了
2022.4.24
=========================================================================
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
=========================================================================