嵌入式之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

(一)创建按钮

 第一种方式:

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

第二种方式: 

QPushButton *btn = new QPushButton("我创建的按钮",this);
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个,所以这种方式有点浪费资源

//创建菜单栏
QMenuBar *menubar = new QMenuBar(this);
this->setMenuBar(menubar);
//创建菜单
QMenu *menu1 = new QMenu("文件");
QMenu *menu2 = new QMenu("编辑");
QMenu *menu3 = new QMenu("构建");
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);

//创建菜单项
QAction *act1 = new QAction("打开文件");
QAction *act2 = new QAction("另存为");
QAction *act3 = new QAction("关闭");
menu1->addAction(act1);
menu1->addAction(act2);
menu1->addAction(act3);

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

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

//创建菜单栏
QMenuBar *menubar = menuBar();
//创建菜单
QMenu *menu1 = new QMenu("文件");
QMenu *menu2 = new QMenu("编辑");
QMenu *menu3 = new QMenu("构建");
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);

//创建菜单项
QAction *act1 = new QAction("打开文件");
QAction *act2 = new QAction("另存为");
QAction *act3 = new QAction("关闭");
menu1->addAction(act1);
menu1->addAction(act2);
menu1->addAction(act3);

 (二)工具栏的创建

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

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

//创建工具栏
QToolBar *toolbar = new ToolBar(this);
this.addToolBar(toolbar);
//创建工具项
QAction *act1 = new QAction("打开文件");
QAction *act2 = new QAction("另存为");
QAction *act3 = new QAction("关闭");
QAction *act4 = new QAction("工具");

toolbar.addAction(act1);
toolbar.addAction(act2);
toolbar.addAction(act3);
toolbar.addAction(act4);

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

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

//创建工具栏
QToolBar *toolbar = addToolBar();
//创建工具项
QAction *act1 = new QAction("打开文件");
QAction *act2 = new QAction("另存为");
QAction *act3 = new QAction("关闭");
QAction *act4 = new QAction("工具");

toolbar.addAction(act1);
toolbar.addAction(act2);
toolbar.addAction(act3);
toolbar.addAction(act4);

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

//QStatusBar *statusbar = new QStatusBar(this);
//this.setStatusBar(statusbar);

QStatusBar *statusbar = statusBar();
//添加正式信息(一般位于状态栏左侧)
QLable *label1 = new QLabel("打开文件",this);
statusbar->addWidget(label1);    

//添加永久信息(一般位于状态栏右侧)
QLable *label2 = new QLabel("www.baidu.com",this);
statusbar->addPermanagementWidget(label2);    

 (四)铆接部件

//创建铆接部件
QDockWidget *dockwidget = new QDockWidget("这是一个铆接部件", this);

//将浮动窗口添加到mainwindow
this‐>addDockWidget(Qt::TopDockWidgetArea, dockwidget);

 (五)中心部件

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

五、创建资源文件

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

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

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

4、添加前缀和图片信息 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
嵌入式Linux Qt开发摄像头播放器需要进行以下步骤: 1. 首先,确保嵌入式Linux系统已正确配置,并且在嵌入式设备上已经安装了Qt开发框架。 2. 接下来,需要在Qt开发环境中创建一个新项目,选择设备和编译器设置为嵌入式Linux系统所使用的配置。 3. 在Qt项目中,需要使用Qt Multimedia模块来实现摄像头的播放功能。这可以通过在Qt项目的.pro文件中添加“QT += multimedia”来实现。 4. 使用Qt多媒体模块中的QCamera和QCameraViewfinder类,可以实现对摄像头的访问和运行。在Qt的代码中,可以通过创建一个QCamera对象并设置所需的参数,如分辨率、帧率等来连接到摄像头设备。 5. 创建一个QCameraViewfinder对象,并将其与QCamera对象连接起来。这将显示来自摄像头的视图,用户可以在应用程序中查看实时图像。 6. 接下来,可以通过创建一个QVBoxLayout对象来布局摄像头视图,并将其添加到QWidget或QMainWindow窗口中。这样,摄像头视图将嵌入到应用程序的图形界面中。 7. 最后,可以运行应用程序,它将打开并运行嵌入式Linux系统上连接的摄像头设备。用户将能够在应用程序中实时查看摄像头的视频。 嵌入式Linux Qt开发摄像头播放器需要使用Qt的多媒体模块来实现摄像头的访问和播放功能。通过正确配置嵌入式Linux系统和Qt开发环境,以及使用QCamera和QCameraViewfinder类,可以创建一个具有摄像头播放功能的应用程序。这样,用户可以在嵌入式设备上实时查看摄像头的视频。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值