ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:276.93KB ,
资源ID:5607643      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5607643.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(09计科A23430110陈南博实训二.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

09计科A23430110陈南博实训二.docx

1、09计科A23430110陈南博实训二上海第二工业大学计算机科学与技术系学生实训报告课程名称嵌入式操作系统课程设计实训类别验证型实训项目名称创建对话框班级09计科A2姓名陈南博学号20113430110实训时间2012年10月24日实训地点15号楼507指导教师崔莉莉组号同组学生信息(请填写在下方)班级姓名学号一、 实训内容、结果与分析1 完成书本第二部分“创建对话框”中的2.1例题find、2.3例题gotocell、2.4例题sort,其中报告提交find或sort其中一个的代码解释,给出利用Qt designer设计gotocell的主要过程和步骤。三个程序运行结果2.1Find:2.3

2、Gotocell:2.4Sort:Find的代码及解释:先看finddialog.h#ifndef FINDDIALOG_H “防止对这个文件的多重包含”#define FINDDIALOG_H 书上是这么解释我看了几遍是没看懂什么意思后来问了老师明白了,是用于自己定义的头文件防止重复定义#include 声明QDialog类class QCheckBox; 简单申明QCheckBox类的存在class QLabel; 简单申明QLabel类的存在class QLineEdit; 简单申明QLineEdit类的存在class QPushButton; 简单申明QPushButton类的存在cl

3、ass FindDialog:public QDialog 定义Finddialog作为QDialog的一子类 Q_OBJECT 对已定义了信号和槽的类,在类定义开始出的Q_OBJECT宏定义是必须的public: FindDialog(QWidget *parent = 0,const char *name = 0);parent是父类窗口部件,name是这个窗口部件的名称signals: 信号 void findNext(const QString &str,bool caseSensitive); findNext信号定义 void findPrev(const QString &str

4、,bool caseSensitive); findPrev信号定义private slots: 槽 void findClicked(); 定义findclicked槽 void enableFindButton(const QString &text); 定义enableFindButton槽private: 声明一些私有成员 QLabel *label; 声明label成员 QLineEdit *lineEdit; QCheckBox *caseCheckBox; 这几个不再累述 QCheckBox *backwardCheckBox; QPushButton *findButton;

5、QPushButton *closeButton;#endif 与第一第二行相对应接下来看finddialog.cpp:#include 头文件的声明#include #include #include “”优先查找系统库,系统头文件#include #include finddialog.h “”优先查找相对路径的声明头文件FindDialog:FindDialog(QWidget *parent, const char *name) : QDialog(parent, name) parent和name传递给基类的构造函数 setCaption(tr(Find); 设置窗口标题 label

6、=new QLabel(tr(Find &what:),this); 新建基于QLabel 的label lineEdit=new QLineEdit(this); 新建基于QLineEdit 的lineEdit label-setBuddy(lineEdit); 建立关系label与lineedit caseCheckBox=new QCheckBox(tr(Match &case),this); 新建基于QCheckBox 的caseCheckBox backwardCheckBox=new QCheckBox(tr(Search &backward),this); 新建基于QCheckB

7、ox 的backwardCheckBox findButton=new QPushButton(tr(&Find),this); “&”用于加速键 findButton-setDefault(true); findButton设置为”缺省” findButton-setEnabled(false); findButton设置为”不可选” closeButton=new QPushButton(tr(Close),this); 新建基于QPushButton的closeButton connect(lineEdit,SIGNAL(textChanged(const QString &), thi

8、s,SLOT(enableFindButton (const QString &);信号lineedit发生调用就调用槽enableFindButton connect(findButton,SIGNAL(clicked(), this,SLOT(findClicked();信号findButton 发生clicked()就调用槽findClicked() connect(closeButton,SIGNAL(clicked(), this,SLOT(close();信号closeButton发生clicked()就调用槽close() QHBoxLayout *topLeftLayout=n

9、ew QHBoxLayout; 新建一个名为topLeftLayout的QHBoxLayou框架 topLeftLayout-addWidget(label); 把label放入框架topLeftLayout topLeftLayout-addWidget(lineEdit); 把lineEdit放入框架topLeftLayout QVBoxLayout *leftLayout=new QVBoxLayout; 新建一个名为leftLayout 的QHBoxLayou框架 leftLayout-addLayout(topLeftLayout); 把topLeftLayout放入框架leftLa

10、yout leftLayout-addWidget(caseCheckBox); 把caseCheckBox 放入框架leftLayout leftLayout-addWidget(backwardCheckBox); 把backwardCheckBox放入框架leftLayout QVBoxLayout *rightLayout=new QVBoxLayout; 新建一个名为rightLayout的QHBoxLayou框架 rightLayout-addWidget(findButton); 把findButton 放入框架rightLayout rightLayout-addWidget(

11、closeButton); 把closeButton 放入框架rightLayout rightLayout-addStretch(1); 设置一个弹簧放入框架rightLayout QHBoxLayout *mainLayout=new QHBoxLayout(this); 新建一个名为mainLayout的QHBoxLayou框架 mainLayout-setMargin(11);设置mainLayout边缘 mainLayout-setSpacing(6); 设置mainLayout空隙 mainLayout-addLayout(leftLayout); 把leftLayout 放入框架

12、mainLayout mainLayout-addLayout(rightLayout); 把rightLayout放入框架mainLayoutvoid FindDialog:findClicked() findclicked槽 用于find按键的clicked事件 QString text=lineEdit-text(); linedit的值赋予text() bool caseSensitive=caseCheckBox-isOn(); 打开caseCheckBox if(backwardCheckBox-isOn() 如果 backwardCheckBox打开 emit findPrev(

13、text,caseSensitive); 发射findprev信号 else emit findNext(text,caseSensitive); 否则发射findNext信号void FindDialog:enableFindButton(const QString &text) enableFindButton槽定义 findButton-setEnabled(!text.isEmpty(); lineEdit不为空,find按钮生效 Main.cpp:#include 头文件#include finddialog.h 头int main(int argc, char *argv) 声明

14、QApplication app(argc,argv); FindDialog *dialog =new FindDialog; 新建 app.setMainWidget(dialog); dialog-show(); dialog可见 return app.exec(); 运行exe设计gocell主要过程:QT创建一个dialog1添加一个文本标签,设置name属性为label,text为&Cell Location:2添加行编辑器,name-lineedit3添加间隔期,orientation-horizontal4添加第一个按钮,name-okbutton,enable-false,d

15、efault-ture,text-OK5添加第二个按钮,name-cancelButton,text-Cancel6窗体本身,name-GoToCellDialog,caption-Go to Cell使用Tools|Set Buddy设置label和edit的伙伴关系摆放部件1单击打Cell location标签下的shift,单击layout|lay out horizontally2单击间隔器与2个button,使用layout|lay out horizontally3单击背景取消任何选择,使用layout|lay out horizontally4单击使用layout|adjust

16、size单击tool|tab order设置tab时的空间选中顺序设置信号与槽单击edit|connections设计如下enableOKbutton需要新建如下在工程下新建一个main.cpp文件:#include #include gotocelldialog.hint main(int argc, char *argv) QApplication app(argc,argv); GoToCellDialog *dialog=new GoToCellDialog; app.setMainWidget(dialog); dialog-show(); return app.exec();生成之

17、后有问题,OK失效 行编辑器接受任何文本,而不是接受有效的单元格定位。结果:2 理解2.2节“信号与槽”相关内容,查阅资料,写出大约一页A4纸的小论文(字号为五号,行间距为单倍),要求有自己对“信号与槽”的概念理解。红色是干要部分,黑色是扩充补充,因为原文的逻辑性和语言比较慎密,感觉如果剪切顺序可能并没有原文表达的好,我会扩充一些,我是认真去查看过资料的,并不是随便网上随便拉一篇应付的。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的 C/C+ 语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C+ 预处理

18、程序,它为高层次的事件处理自动生成所需要的附加代码。窗口小部件 (widget) 都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在 QT 中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的,不会像回调函数那样产生 core dumps。所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射 (emit) 出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封

19、装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。 信号当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。只有当所有的槽返回以后发射函数(emit)才返回。 如

20、果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。信号的声明是在头文件中进行的,QT 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。例如,下面定义了三个信号:signals: void mySignal(); void mySignal(int x); void mySignalParam(int x,int y);在上面的定义中,signals 是 QT 的关键字,而非 C/C+ 的。接下来的一行 void mySignal() 定义了信号 mySi

21、gnal,这个信号没有携带参数;接下来的一行 void mySignal(int x) 定义了重名信号 mySignal,但是它携带一个整形参数,这有点类似于 C+ 中的虚函数。从形式上讲信号的声明与普通的 C+ 函数是一样的,但是信号却没有函数体定义,另外,信号的返回 类型都是 void,不要指望能从信号返回什么有用信息。信号由 moc 自动产生,它们不应该在 .cpp 文件中实现。 槽当一个槽为一个信号来执行的时候,这个返回值就会忽略,但是把槽作为一个函数来调用的时候,返回值对我们的作用和我们调用一个普通的C+函数一样。槽是普通的 C+ 成员函数,可以被正常调用,它们唯一的特殊性就是很多信

22、号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的 C+ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots 和 protected slots。public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protected slots:在这个区内声明的槽意味着当前类及其子类可

23、以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。槽也能够声明为虚函数,这也是非常有用的。槽的声明也是在头文件中进行的。信号与槽的关联最简单的信号与槽的关联:控件事件send信号单目标槽接受目标控件做出相应单信号与多槽的关联: 控件事件send信号多个目标槽接受多个目标控件做出相应信号与信号关联:控件事件send信号目标接受目标send信号通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者

24、发射信号时,接收者的槽函数将被调用。该函数的定义如下: bool QObject:connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) static这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的 member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏 SIGNAL(),当指定槽函数时必须使用宏 SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connec

25、t 调用中接收者参数可以省略。一个信号甚至能够与另一个信号相关联, connect( aButton, SIGNAL(clicked(), SIGNAL(aSignal() ); 当信号与槽没有必要继续保持关联时,我们可以使用 disconnect 函数来断开连接。其定义如下: bool QObject:disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) static这个函数断开发射者中的信号与接收者中的槽函数之间的关联。有三种情况必须使

26、用 disconnect() 函数:断开与某个对象相关联的任何对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或者多个信号,这些信号与另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就可以利用这个方法,非常之简洁。 disconnect( myObject, 0, 0, 0 ) 或者 myObject-disconnect()断开与某个特定信号的任何关联。 disconnect( myObject, SIGNAL(mySignal(), 0, 0 ) 或者 myObject-disconnect( SIGNAL(mySignal() )断开两个对象之间的关联。 disco

27、nnect( myObject, 0, myReceiver, 0 ) 或者 myObject-disconnect( myReceiver )在 disconnect 函数中 0 可以用作一个通配符,分别表示任何信号、任何接收对象、接收对象中的任何槽函数。但是发射者 sender 不能为 0,其它三个参数的值可以等于 0。 我昨晚实验后有个疑问,每个例题编译完之后都会产生moc_*,那么moc作用又是什么?元对象编译器 moc(meta object compiler)对 C+ 文件中的类声明进行分析并产生用于初始化元对象的 C+ 代码,元对象包含全部信号和槽的名字以及指向这些函数的指针。m

28、oc 读 C+ 源文件,如果发现有 Q_OBJECT 宏声明的类,它就会生成另外一个 C+ 源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件 mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前 moc 工具就会根据该文件自动生成一个名为 mysignal.moc.h 的 C+ 源文件并将其提交给编译器;类似地,对应于 mysignal.cpp 文件 moc 工具将自动生成一个名为 mysignal.moc.cpp 文件提交给编译器。元对象代码是 signal/slot 机制所必须的。用 moc 产生的 C+ 源文件必须与类实现一起进行编译和连接,

29、或者用 #include 语句将其包含到类的源文件中。moc 并不扩展 #include 或者 #define 宏定义 , 它只是简单的跳过所遇到的任何预处理指令。应注意的问题信号与槽机制是比较灵活的,但有些局限性我们必须了解,这样在实际的使用过程中做到有的放矢,避免产生一些错误。下面就介绍一下这方面的情况。1 使用槽与型号会,降低运行效率.信号与槽的效率是非常高的,但是同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失,当然这种损失相对来说是比较小的,通过在一台 i586-133 的机器上测试是 10 微秒(运行 Linux),可见这种机制所提供的简洁性、灵活性还是值得的。

30、但如果我们要追求高效率的话,比如在实时系统中就要尽可能的少用这种机制。2 信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。3 如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。4. 宏定义不能用在 signal 和 slot 的参数中。既然 moc 工具不扩展 #define,因此,在 signals 和 slots 中携带参数的宏就不能正确地工作,如果不带参数是可以的。5. 构造函数不能用在 signals 或者 slots 声明区域内。的确,将一个构造函数放在 signals 或者 slots 区内有点不可理解,无论如何,不能将它们放在 private slots、protected slots 或者 public slots 区

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1