第五章:主窗口
一、概述
- Qt提供了QMainWindow和其相关的类进行窗口的管理。
- QMainWindow类包含:菜单栏、工具栏、状态栏、中心部件、锚接部件
- 创建主窗口方法:
一、全部代码生成,单继承自QMainWindow类,在子类的实现文件中使用代码创建应用程序主窗口的菜单、工具栏、锚接部件以及状态栏等并设置它们的属性;
二、使用Qt设计师绘制应用程序主窗口,然后添加菜单、工具栏等,并进行属性设置、关联信号与槽;与代码相结合; - 成员函数
QMenuBarQMainWindow.::menuBar ( ) const //菜单栏
QToolBar QMainWindow::addToolBar ( const QString& title ) //工具栏
void QMainWindow::setCentralWidget ( QWidget* widget ) //中心部件
QStatusBar*QMainWindow::statusBar ( ) const //状态栏
二、菜单栏
- QMenuBar类提供一个水平的菜单栏,可添加QMenu对象,在下拉框加QAction类型动作对象。
e.g:
//添加“文件”菜单
Menu *fileMenu = ui.menuBar->addMenu(tr("文件(&F)"));
//添加“打开文件”动作
QAction *action_Open = fileMenu.addAction(QIcon("../imageslopen.png"),tr("打开文件(&O)""));
- QAction类常用方法:
setShortcut)设置快捷键
setStatusTip ()设置状态提示
setlcon(Qlcon(“图片路径”))
QAction::triggered ( )【信号】当在此动作中单击鼠标,则发送该信号。
QAction类示例:
QAction *openAction;
//构造一个QAction类的对象
openAction = new QAction(tr("&open"), this) ;//设置动作快捷键
openAction->setShortcut (QKeySequence : : 0pen);//状态栏显示
openAction->setStatusTip(tr("open a file."));//把这个QAction添加到菜单
QMenu*file = menuBar ()->addMenu(tr("&File"));file->addAction(openAction) ;
//把这个QAction添加到工具条:
QToolBar *toolBar = addToolBar(tr("&File"));toolBar->addAction(openAction) ;
三、工具栏
- QToolBar类:常用QToolbar和QComboBox
e.g:
四、状态栏
- QStatusBar类提供了一-个水平条,用来显示状态信息。
- 状态信息可以被分为三类:
●临时信息,如一般的提示信息;使用showMessage()函数来显示一个临时消息,它会出现在
状态栏的最左边。
●正常信息,如显示页数和行号;一般用addWidget()函数添加一-个QL abel到状态栏上用于显.
示正常信息,它会生成到状态栏的最左边,可能会被临时消息所掩盖。
●永久信息,如显示版本号或者日期。如果要显示永久信息,要使用addPermanentWidget()函数来添加一个如QLabel一样的可以显示信息的部件,它会生成在状态栏的最右端,不会被临时消息所掩盖。
//显示临时消息,显示2000毫秒即2秒钟
ui->statusBar->showMessage(tr("欢迎使用多文档编辑器"), 2000);
//创建标签,设置标签样式并显示信息,将其以永久部件的形式添加到状态栏
QLabel *permanent = new QL abel(this);
permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);
permanent->setText("“status display");
ui->statusBar-> addPermanentWidget(permanent);
结果:“欢迎使用多文档编辑器”字符串在显示一会儿后就自动消失了,而“status display-直显示在状态栏最右端。
五、中心部件
//创建中心部件
QTextEdit * text;
text = new QTextEdit(this);
setCentralWidget(text);
六、资源机制
- Qt资源机制是一-个独立于平台的(跟使用的操作系统无关)用于在可执行文件中存
储二进制文件的机制,是Qt核心机制之一。 - 可以让需要的文件(图片、文本等)包含到程序编程生成的可执行文件(例如
exe文件)中。保证了程序中使用的文件不会丢失、不会因为存放路径而导致程序运行错误。使用资源集( Resource Collection Files) 文件,即 .qrc文件。qmake能够识别这个资源集文件,并且能够根据它的描述去相应的目录下定位具体的资源。 - qrc资源文件是基于标准xml格式的文本文件,列出了所有嵌入到可执行文件中的文件,条理非常清晰,易于阅读和维护。
- 引用使用:加 : /
第六章:事件机制
- QEvent类
- 当调用QApplication: :exec()时,就进入了事件循环
- 事件传递与处理:
e.g键盘按键事件传递示意:
- 鼠标及滚轮事件:QMouseEvent类、QWheelEvent类
void mousePressEvent( QMouseEvent * event);
void mouseReleaseEvent( QMouseEvent * event);
void mouseDoubleClickEvent( QMouseEvent *event);
void mouseMoveEvent( QMouseEvent * event);
void wheelEvent( QWheelEvent * event);
- 键盘事件:QKeyEvent类;key()函数可以获取具体按键(如果是方向键,对应:Key_Up、Key_Down、Key_Left、Key_Right)。
e.g:
头文件:
protected:
void keyPressEvent( QKeyEvent * event);
void keyReleaseEvent( QKeyEvent * event);
c文件:
void Widget::keyPressEvent(QKeyEvent * event){
//键盘按下事件
if(event->modifiers() == Qt::ControlModifier){ //是否按下 Ctrl键
if(event->key()== Qt::Key_M) //是否按下M键
setWindowState(Qt::WindowMaximized);//窗口最大化
}
else QWidget::keyPressEvent(event);
}
void Widget::keyReleaseEvent( QKeyEvent * event){ //按键释放事件
}
- 定时器事件与随机数:定时器是QTimerEvent类;随机数用qrand()或qsrand()函数实现。
开启1s定时器:startTimer(1000);
获取当前时间:
QTime time = QTime::currentTime();
QString text = time.toString("hh:mm");
if((time.second()%2)==0) //每隔1s将“:”显示为“ ”
text[2]='';
第七章:绘图
- QPainter类提供绘图操作。
- 详细见后期的例程实验。
(第八章多线程编程–略)
第九章:网络编程
- 基本概念:
TCP/IP: 传输控制协议/因特网互联协议(网络通讯协议),是Internet最基本的协议,由传输层的TCP协议和网络层的IP协议等组成;
HTTP: 超文本传输协议,面向网页,传输被包装成TCP协议传输;
FTP(File Transfer Protocol): 文件传输协议,面向文件;
SOCKET: 是实现传输层协议的一种编程API,可以是TCP,也可以是UDP;
URL组成: 资源类型、存放资源的主机域名、资源文件名。
IP: 分IPv4(32位)和IPv6(128位)两大类。 - SOCKET
socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
是不同PC进程间的通信机制。
socket类型:
① 数据流SOCK_STREAM:基于TCP的Socket,面向连接,提供给应用层可
靠的流式数据服务,使用TCP的Socket应用程序协议:HTTP,FTP等。优点:基于数据传输的可靠性。
② 数据报SOCK_DGRAM:基于UDP的Socket,无连接,适用于数据传输可靠性要求不高的场合。基于UDP的Socket应用程序或协议有:RIP,SNMP,L2TP等。 - TCP
TCP(Transmission Control Protocol,传输控制协议)是一个用于数据传输的低层的网络协议,多个互联网协议(包括HTTP和FTP)都是基于 TCP协议的。TCP是一个面向数据流和连接的可靠的传输协议。QTcpSocket类 为TCP提供了一个接口,该类也继承自QAbstractSocket。与QUdpSocket传输的数据报不同,QTcpSocket传输的是连续的数据流,尤其适合于连续的数据传输。TCP编程一般分为客户端和服务器端,也就是所谓的C/S(Client/Server)模型。
TCP编程步骤:
- UDP
UDP(User Datagram Protocol,用户数据报协议)是一个轻量级的、不可靠的、面向数据报的、无连接的协议,用于可靠性不是非常重要的情况。例如,一个服务器报告一天的时间可以选择UDP。如果一个包含时间的数据报丢失了,那么客户端可以简单地发送另外一个请求。UDP一般分为发送端和接收端。
QUdpSocket类用来发送和接收UDP数据报,继承自QAbstractSocket。这里的Socket就是所谓的“套接字”,简单来说,套接字就是一个IP地址加一个port端口号。这样就可以实现两台主机的两个应用程序间通信。
UDP编程步骤:
QUdpSocket类最通用的使用方式是:
(1)用bind() 函数绑定一个IP地址和端口Port,然后调用writeDatagram()和readDatagram()函数传输数据。
(2)如果要使用QIODevice中的read()、readLine()、write()等函数,必须首先调用connectToHost()函数,直接建立一个和对方的连接。
(3)只要向网络写入了一个数据报,SOCKET就产生一个bytesWritten()信号,如果仅仅是发送数据报,无需调用bind()。
(4)数据报到来,readyRead()信号被产生,此时hasPendingDatagrams()函数返回真(true)。调用pendingDatagramSize()获取第一个数据报的长度(size),readDatagram()读取数据报内容。