当前位置:   article > 正文

嵌入式之Qt开发_qt嵌入式开发

qt嵌入式开发

Qt教程(零基础)参考博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_51568389/article/details/127611678?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169538484216800211549034%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169538484216800211549034&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-3-127611678-null-null.142%5Ev94%5Einsert_down28v1&utm_term=qt%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187

一、按钮QPushButton

(一)创建按钮

 第一种方式:

  1. QPushBtton *btn = new QPusshButton;
  2. //btn->show();另开一个窗口显示按钮
  3. //设置按钮父对象为窗口
  4. btn->setParent(this);

第二种方式: 

  1. QPushButton *btn = new QPushButton("我创建的按钮",this);
  2. this->resize(600,600);

区别: 

方式一:窗口默认大小,按钮显示在左上方

方式二:窗口是按照按钮的大小创建,所以需要重新设置窗口大小

(二)设置按钮属性

具体信息查文档,这里只提示函数名,形参不提供 

属性含义
setText设置按钮内容
move设置按钮显示位置
setFixedSize设置按钮固定大小

 二、对象模型(对象树)

(一)对象模型 

总结:1、组件需要指定父类,不然这个组件是新的组件,调用show函数会新开一个窗口。2、指定父类后不需要手动释放资源,父对象会自动调用析构函数。

在Qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个parent到底
是干什么的。
QObject是以对象树的形式组织起来的。
        当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于, 在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。 n 当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)
QWidget是能够在屏幕上显示的一切组件的父类。
        QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件 。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。
        当然, 我们也可以自己删除子对象,它们会自动从其父对象列表中删除。 比如,当我们删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示。
Qt 引入对象树的概念,在一定程度上解决了内存问题。
1、 当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
2、任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。
如果QObject在栈上创建,Qt 保持同样的行为。正常情况下,这也不会发生什
么问题。
来看下下面的代码片段:
{
        QWidget window;
        QPushButton quit = QPushButton (" 退出 ", &window);
}
        作为父组件的 window 和作为子组件的 quit 都是QObject的子类(事实上,它们都是QWidget的子类,而QWidget是QObject的子类)。这段代码是正确的,quit 的析构函数不会被调用两次因为标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作用域时,会先调用 quit 的析构函数,将其从父对象 window 的子对象列表中删除,然后才会再调
用 window 的析构函数。
但是,如果我们使用下面的代码:
{
QPushButton quit("Quit");
QWidget window;
quit.setParent(&window);
}
        情况又有所不同,析构顺序就有了问题。我们看到,在上面的代码中,作为父对象的 window 会首先被析构,因为它是最后一个创建的对象。在析构过程中,它会调用子对象列表中每一个对象的析构函数,也就是说, quit 此时就被析构了。然后,代码继续执行,在 window 析构之后,quit 也会被析构,因为 quit也是一个局部变量,在超出作用域的时候当然也需要析构。但是,这时候已经是第二次调用 quit 的析构函数了,C++ 不允许调用两次析构函数,因此,程序崩溃了。由此我们看到,Qt 的对象树机制虽然帮助我们在一定程度上解决了内存问题, 但是也引入了一些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰一下,所以,我们最好从开始就养成良好习惯。
在 Qt 中,尽量在构造的时候就指定 parent 对象,并且大胆在堆上创建

(二)常见的控件类关系

1、QWidget、QDialog和QMainWindow的关系 

2、常用控件的关系 

3、窗口的分类与继承关系 

 三、信号与槽

(一)connect函数 

connect(sender,signal,receiver,slot); 

参数:
1、sender:信号发出者
2、signal:信号
3、recerver:信号的接收者
4、slot:接收到信号执行任务(槽函数)        

(二)emit 

含义:发出信号 

总结: 

1、发送者与接收者需要是QObject的子类(槽函数全局,lambda除外)

2、信号和槽函数返回值都是void

3、信号需要声明不需要定义实现,槽函数需要声明也需要定义实现()

4、槽函数是普通的成员函数,作为成员函数,会受到public、private、protected的影响

5、使用emit在恰当的位置发送信号

6、使用connect()函数连接信号与槽

7、任何成员函数、static函数、全局函数和Lambda表达式都可以作为槽函数

8、信号槽要求信号和槽参数一致,所谓的一致,是参数类型的一致

9、如果信号和槽的参数不一致,允许的情况是。槽函数的参数可以比信号的少,即便如此,槽函数存在的顺序也必须和前面的几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号少)

Qt教程(零基础)参考博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_51568389/article/details/127611678?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169538484216800211549034%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=169538484216800211549034&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-3-127611678-null-null.142%5Ev94%5Einsert_down28v1&utm_term=qt%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187

四、QMainWindow 

(一)菜单栏的创建 (优先用成员函数)

第一种方式(new的方式):

说明:该方式需要创建多个菜单栏时可用,一般菜单栏最多有1个,所以这种方式有点浪费资源

  1. //创建菜单栏
  2. QMenuBar *menubar = new QMenuBar(this);
  3. this->setMenuBar(menubar);
  4. //创建菜单
  5. QMenu *menu1 = new QMenu("文件");
  6. QMenu *menu2 = new QMenu("编辑");
  7. QMenu *menu3 = new QMenu("构建");
  8. menubar->addMenu(menu1);
  9. menubar->addMenu(menu2);
  10. menubar->addMenu(menu3);
  11. //创建菜单项
  12. QAction *act1 = new QAction("打开文件");
  13. QAction *act2 = new QAction("另存为");
  14. QAction *act3 = new QAction("关闭");
  15. menu1->addAction(act1);
  16. menu1->addAction(act2);
  17. menu1->addAction(act3);

第二种方式(成员函数方式): 

说明:该方式只能一个菜单栏,如果该窗口已经存在菜单栏,返回之前已经创建好的菜单栏对象的指针

  1. //创建菜单栏
  2. QMenuBar *menubar = menuBar();
  3. //创建菜单
  4. QMenu *menu1 = new QMenu("文件");
  5. QMenu *menu2 = new QMenu("编辑");
  6. QMenu *menu3 = new QMenu("构建");
  7. menubar->addMenu(menu1);
  8. menubar->addMenu(menu2);
  9. menubar->addMenu(menu3);
  10. //创建菜单项
  11. QAction *act1 = new QAction("打开文件");
  12. QAction *act2 = new QAction("另存为");
  13. QAction *act3 = new QAction("关闭");
  14. menu1->addAction(act1);
  15. menu1->addAction(act2);
  16. menu1->addAction(act3);

 (二)工具栏的创建

 第一种方式(new的方式):

说明:通过new的方式构造工具栏,可以设置工具栏初始方式

  1. //创建工具栏
  2. QToolBar *toolbar = new ToolBar(this);
  3. this.addToolBar(toolbar);
  4. //创建工具项
  5. QAction *act1 = new QAction("打开文件");
  6. QAction *act2 = new QAction("另存为");
  7. QAction *act3 = new QAction("关闭");
  8. QAction *act4 = new QAction("工具");
  9. toolbar.addAction(act1);
  10. toolbar.addAction(act2);
  11. toolbar.addAction(act3);
  12. toolbar.addAction(act4);

第二种方式(成员函数方式):

说明:通过函数方式构造工具栏,不能设置工具栏初始方式 

  1. //创建工具栏
  2. QToolBar *toolbar = addToolBar();
  3. //创建工具项
  4. QAction *act1 = new QAction("打开文件");
  5. QAction *act2 = new QAction("另存为");
  6. QAction *act3 = new QAction("关闭");
  7. QAction *act4 = new QAction("工具");
  8. toolbar.addAction(act1);
  9. toolbar.addAction(act2);
  10. toolbar.addAction(act3);
  11. toolbar.addAction(act4);

(三)状态栏的创建(优先用成员函数)

  1. //QStatusBar *statusbar = new QStatusBar(this);
  2. //this.setStatusBar(statusbar);
  3. QStatusBar *statusbar = statusBar();
  4. //添加正式信息(一般位于状态栏左侧)
  5. QLable *label1 = new QLabel("打开文件",this);
  6. statusbar->addWidget(label1);
  7. //添加永久信息(一般位于状态栏右侧)
  8. QLable *label2 = new QLabel("www.baidu.com",this);
  9. statusbar->addPermanagementWidget(label2);

 (四)铆接部件

  1. //创建铆接部件
  2. QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件"this);
  3. //将浮动窗口添加到mainwindow
  4. this‐>addDockWidget(Qt::TopDockWidgetArea, dockwidget);

 (五)中心部件

  1. //创建铆接部件
  2. QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件"this);
  3. //创建文本编辑器
  4. QTextEdit *edit = new QTextEdit("文本编辑器"this);
  5. //设置中心部件
  6. dockwidget‐>setWidget(edit);
  7. //将浮动窗口添加到mainwindow
  8. this‐>addDockWidget(Qt::TopDockWidgetArea, dockwidget);

五、创建资源文件

1、首先在项目里创建一个装图片的文件夹(img)

 2、在项目上右键选择添加新文件

3、选择Qt界面的Qt Resources File(资源文件)

4、添加前缀和图片信息 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/613506
推荐阅读
相关标签
  

闽ICP备14008679号