基于Qt的电视机UI实现技术(2)

2019-08-01 22:35

AQFrameBCQFrameQRadioButtonQListWidgetQListWidgetQFrameDTextListTextListTextListTextListTextListTextListTextListTextListQGroupBoxQGroupBoxQGroupBoxQGroupBoxQSlider

图1-4-3 控件划分示意图

上图中的D区域,使用了两个QFrame,外侧较大的QFrame目的是将所有的QGroupBox装到一起,在响应上下键时做整体移动;内存较小的QFrame目的是遮罩,只显示出4组QGroupBox。B,C区域使用的QListWidget类有一个很好的属性,当设置当前的item(QListWidget::setCurrentItem)时,QListWidget会自动调整列表的位置,并且只要预先设置了QListWidget的几何属性,便决定了QListWidget的可见区域。

2 内存管理

2.1 Qt内存管理规则

C++语言没有提供自动的内存管理。通常,应用程序的编写者必须自己处理内存分配与从QObject类派生而来的类的一些对象,可以由一个树形结构来管理。这些对象可能会回收的问题。Qt可以接管一部分内存管理的工作。

产生子对象。如果一个对象被delete掉了,那么Qt会自动delete掉它所有的子对象,并且这些子对象会依序delete掉它们的子孙。也可以这样理解,如果一个对象树的根对象消失了,则Qt自动删除整棵树。

Qt这种自动管理内存的功能,可以使编程人员从追踪对象的子对象及释放它们所占用的内存空间的工作中解脱出来。但是,为了使这种自动内存管理的功能起作用,所有的子对象(以及子对象的子对象)必须在堆中分配内存(即通过使用操作符new来产生子对象)。用new操作符创建对象会返回一个指向堆的指针。

在每一个Qt对象中,都有一个链表,这个链表保存有它所有子对象的指针。当创建一个新的Qt对象的时候,如果把另外一个Qt对象指定为这个对象的父对象, 那么父对象就

会在它的子对象链表中加入这个子对象的指针。另外,对于任意一个Qt对象而言,在其生命周期的任何时候,都还可以通过setParent函数 重新设置它的父对象。当一个父对象在被delete的时候,它会自动的把它所有的子对象全部delete。当一个子对象在delete的时候,会把它自己 从它的父对象的子对象链表中删除。对象的父子关系大大简化了内存管理,并且降低了内存泄露的风险。对于使用new创建的对象,我们只需要delete那些没有父对象的便可以了。

父对象、子对象及父对象的子对象列表关系如图2-1-1所示:

ParentObjChild1ObjParent子对象列表Child1Child2...ObjChild2Parent图2-1-1 父对象、父对象的子对象列表及子对象间的关系

以通过其它方式让其具有父对象,形成父子关系:

情况1:布局管理器对其所管理的对象,可以统一指定父对象。例如: #include #include #include

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QWidget window;

有以下几种情况,在使用new操作符创建一个对象时,不需要显式地指定父对象,但可

QVBoxLayout* mainLayout = new QVBoxLayout(&window);//指定布局管理

//器的父对象,同时该布局管理器内的所有部件的父对象,也被指定

QLabel* label1 = new QLabel(\//创建时未指定父对象 QLabel* label2 = new QLabel(\//创建时未指定父对象 mainLayout->addWidget(label1);//加入布局管理器 mainLayout->addWidget(label2); //加入布局管理器

window.show(); return a.exec(); }

以上代码中,在用new创建两个QLabel对象时,并没有指定其父对象。但是通过布局管理器的addWidget()被加入到布局管理器之后,它们的父对象就成了window,因为布局管理器创建时指定了自己的父对象为window。它们之间的父子关系如图2-1-2所示:

父对象window子对象子对象子对象mainLayout label1 label2 图2-1-2 父子关系

情况2:将一个对象设置为一个QMainWindow对象的Cnetral Widget时,QMainWindow接管该对象的指针,并在合适的时间将其删除。例如: #include #include #include

int main(int argc, char *argv[]) {

QApplication a(argc, argv); QMainWindow mainWindow;

QLabel *label = new QLabel(\//未指定父对象

mainWindow.setCentralWidget(label);//label对象被mainWindow“收养” mainWindow.show(); return a.exec(); }

在以上代码中,用new创建label对象时,没有指定父对象。通过调用setCentralWidget将label设置为mainWindow的Central Widget之后,label对象被mainWindow“收养”,即mainWindow成为label的父对象。

情况3:将一个QGraphicsItem对象加入到一个QGraphicsScene对象中之后,场景对象成为item对象的父对象。???

2.2 动态创建与删除

在菜单页面之间切换时,伴随着老菜单的删除(或隐藏),新菜单的创建(或显示)的内

存操作动作。Qt是基于C++语言的。内存的分配回收采用new与delete操作符完成。如何动态的创建或删除指定类型的页面对象,有一定的技巧性。

为了在不同菜单之间加以区分,通常会给每一个菜单页分配一个ID号。 typedef enum{ ID_MENU=0, ID_NETWORK, ID_PICTURE, ID_SOUND, ID_CHANNEL, ID_TIME,

//add new item here ID_PICTUREADVANCE, ID_SETUPITEM_MAX }E_ID_SETUPITEM;

在程序中执行菜单切换时,希望给定一个ID号,便能创建一个相应类型的菜单对象,或者给定一个ID号,便能删除一个相应类型的菜单对象。最简单的方法可以用switch-case结构实现。但是代码冗长,效率不高。一下提供了一种实现技巧: 定义两个带模板类的函数:

//用于创建指定类型的页面对象,在堆中分配内存 template MdiSubWindow *allocSc() {

return new _T(); }

//用于删除指定类型的页面对象,回收堆中已分配的内存 template void delSc(MdiSubWindow *ptr) {

delete static_cast<_T*>(ptr); }

//定义两个函数指针,去指向分配内存的函数 typedef MdiSubWindow* (*fnAlloc)();

typedef void (*fnDelete)(MdiSubWindow*);

//定义一个结构体,将创建、删除函数指针封装在一个结构中 struct SFunc { fnAlloc pfnAlloc; fnDelete pfnDelete; };

在类的声明中加入 private:

QMap m_mapSc;//用于存储 ID-函数指针 对 public:

template

int RegisterWindow(int nKey);//向m_mapSc中添加一个ID-函数指针 对 protected:

void RegisterWindows();//将所有的ID-函数指针 对加入m_mapSc int CreateSubWindow(int nKey);//动态创建一个指定页面 int DeleteSubWindow(int nKey);//动态删除一个指定页面 在类的实现中,实现注册函数,完成一张map表: template

int WindowHandler::RegisterWindow(int nKey) { SFunc *funcP=new SFunc;

funcP->pfnAlloc=allocSc<_T>;//将函数指针指向分配内存的函数 funcP->pfnDelete=delSc<_T>;//将函数指针指向释放内存的函数 if(m_mapSc.contains(nKey)) {

return 1; } else {

m_mapSc.insert(nKey, funcP);//将ID-函数指针 对 插入m_mapSc return 0; } }

void WindowHandler::RegisterWindows()


基于Qt的电视机UI实现技术(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:法院实习日志民庭40篇

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: