主窗口设计通常是应用程序界面设计的第一步,主窗口主要分为窗口标题,菜单栏,工具栏和状态栏这四个部分,只要在程序设计中分别对四个项目进行设计就可以实现主窗口的编程了。在下面的例子中,我们就以一个打开文件的例子来介绍主窗口设计。

首先新建工程,打开QT creator5.1,选择新建文件或项目,选择QT Gui应用,它包含一个基于Qt设计师的主窗体,不过我现在先不使用Qt设计师添加控件,而是自己用程序添加。然后工程名,名为OpenFile,然后在详情那一步,要把创建界面的对勾点掉,这样就不使用Qt设计师了。其他步直接next。

然后运行程序,你会发现程序可以运行,然后弹出一个标题为OpenFile的主窗口。

下面我们就要对这个空白的主窗口添加动作(QAction类),动作就是点击菜单栏,工具栏上的控件,触发执行响应的操作。下面我们将菜单栏,工具栏和状态栏的窗口布局设计好,然后用connect建立信号和槽的关系。程序如下:

在mianwindow.h中添加私有变量

  1. private://定义两个私有变量 处理函数open() 和 动作openAction
  2. void open();
  3. QAction *openAction;

在mainwindow.cpp中布局窗口,设置动作,绑定信号与槽的链接

  1. #include "mainwindow.h"
  2. #include <QAction>
  3. #include <QMenuBar>
  4. #include <QMessageBox>
  5. #include <QStatusBar>
  6. #include <QToolBar>
  7. #include <QDialog>
  8. #include <QDebug>
  9.  
  10. MainWindow::MainWindow(QWidget *parent)
  11. : QMainWindow(parent)
  12. {
  13. setWindowTitle(tr("Main Window"));//设置主窗口的标题 tr函数将文本进行国际化,所以文本一般都是英文
  14. openAction = new QAction(QIcon(":/images/doc-open"),tr("&Open..."),this);//创建openAction对象,传入图片,文本和this指针
  15. openAction->setShortcuts(QKeySequence::Open);//使用setShortcut设置快捷键,
  16. //使用QKeySequence设置快捷键,比单纯的tr("Ctrl+O")要有可跨平台的作用,比如windows有Ctrl,mac里没有Ctrl
  17. openAction->setStatusTip(tr("Open an existing file"));//当鼠标滑过这个action时,会在主窗口下方状态栏显示
  18. connect(openAction,&QAction::triggered,this,&MainWindow::open);//connect绑定信号与槽,当信号triggered触发时,会执行open函数
  19. QMenu *file = menuBar()->addMenu(tr("&File"));//创建菜单栏,添加File菜单
  20. file->addAction(openAction);
  21.  
  22. QToolBar *toolBar = addToolBar(tr("&File"));//创建工具栏,添加File工具
  23. toolBar->addAction(openAction);
  24.  
  25. QStatusBar *statusbar = statusBar();//创建状态栏,在窗口下面添加显示动作对象的提示信息
  26. statusbar->addAction(openAction);
  27. }
  28.  
  29. MainWindow::~MainWindow()
  30. {
  31.  
  32. }
  33.  
  34. void MainWindow::open()
  35. {
  36. //QMessageBox::information(this,tr("Information"),tr("Open"));//弹出标准对话框
  37. //QDialog dialog;建立在栈上的dialog,show()会一闪而过
  38. QDialog *dialog = new QDialog;//dialog建立在堆上,show()不会一闪而过
  39. dialog->setAttribute(Qt::WA_DeleteOnClose);
  40. dialog->setWindowTitle(tr("Hello,dialog"));
  41. dialog->exec();//应用程序级别的模态对话框
  42. //dialog.open();//窗口级别的模态对话框
  43. //dialog->show();//非模态对话框
  44. //qDebug()<<dialog->result();
  45. }

使用setWindowTitle()设置窗口的标题,文本使用tr(),是为了将tr函数中的字符串提取出来进行国际化,由于所需进行国际化的文本应该被大多数人认识, 所以tr()一般使用英文文本。

然后创建openAction对象,在QAction构造函数中,传入一个图标,一个文本和this指针。图标使用QIcon,传入的字符串是Qt资源文件的一段路径。后面将介绍如何在QT中加入资源。

setShortcut()函数给QAction定义一个快捷键,QKeySequence为我们提供很多内置的快捷键,而且具有跨平台的作用,相比定义Ctrl+O,只适用与windows系统,Mac系统不存在这个键。用QKeySequence类来添加快捷键,会根据不同平台来定义相应的快捷键。

setStatusTip()设置当鼠标滑过action时,在状态栏显示的内容。

connect()函数,将QAction的triggered()信号与MainWindow类得open()函数绑定起来,当用户点击QAction时,会触发open()函数。

后面三个函数QMenu,QToolBar,QStatusBar分别定义菜单栏,工具栏和状态栏,然后都与动作openAction绑定。

然后定义open()函数,

QMessageBox是标准对话框,将弹出一个小的标题为Information,内容为Open的对话框。

QDialog则是基本对话框,创建一个对话框的类,对话框分为模态对话框和非模块对话框,模态对话框分为应用程序级别的模态对话框,如exec()函数,即当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。另一种是窗口级别的模态对话框,如open()函数,当该种模态对话框出现时,只阻塞与该窗口相连的窗口,其他窗口正常使用。非模块对话框则是不阻塞程序的其他窗口,如show()函数。大家可以用//注释掉其他函数,来分别试试这3中函数的不同。

然后下面我们介绍如何在Qt中使用Qt资源文件。

Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就再也不需要担心这些文件的丢失。也就是说,如果你将资源以资源文件形式存储,它是会编译到可执行文件内部。

在Qt中也可以很方便的创建资源文件,选择项目,右键,添加新文件-》Qt-》Qt资源文件

然后选择,设置名字为 res,下一步,完成。

如下图,编辑res.pro,添加-》添加前缀,前缀:images

然后,将下载一个png图片放到OpenFile的文件夹里,修改名字为document-open.png。

然后,添加-》添加文件,选择document-open.png,QT支持png格式,如果是jpg则需要加载空间,也不是很麻烦。这里以png格式为例。

此时,我们先观察你加载的图片能不能在QT里面显示,如下图,如果document-open.png前有图片的缩略图就说明图片可以使用。

然后点击document-open.png,在下面添加一个别名,便于项目更换图片等资源文件的时候,不用修改程序,只需添加别名就行。

然后右键项目,qmake一下,qmake成功后,点击左下角的绿色三角形按钮,就可以运行程序了。

程序运行结果:

Qt5窗口设计的更多相关文章

  1. fir 窗口设计法

    加窗的原因.对于理想的低通滤波器H(exp(jw)),其h(n)是无限长序列.这是可以证明的.因此为了得到有限长的h(n)就需要截断,而这个过程就是加窗.由于h(n)截断即其频率响应就和理想的低通滤波 ...

  2. Python中Tk模块简单窗口设计

    Python中Tk和PyQt都可以设计小程序,区别在于:Tk界面美观度相对较差,但由于是Python的内置模块,最终生成的程序大小相比于PyQt较小. import tkinter # 导入TKint ...

  3. qt 1 qt开发中的窗口设计

    一个简单的qt界面 相应代码如下: setWindowTitle(tr("Sotware"));//设置窗体标题 ui->tabWidget->removeTab(); ...

  4. 关于Qt5 UI设计的一些小知识

      (1) 获取textEdit中的值   QString str = ui->textedit->toPlainText(); // 这是普通文本 p=str.toInt();     ...

  5. Java实现图形界面的三部曲及IDE中的窗口设计

    设计和实现图形用户界面的工作主要有以下几点: • (1)创建组件(Component) • 创建组成界面的各种元素,如按钮.文本框等.• (2)指定布局(Layout) • 根据具体需要排列它们的位置 ...

  6. 解决qt5窗口不刷新(测试窗口类型,测试窗口属性)

    QApplication::notify #if QT_VERSION >= 0x050000        if (QEvent::Show == pEvent->type())     ...

  7. div悬浮窗口设计来完成注册页面

    login.jsp页面 <script type="text/javascript" src="js/register.js"></scrip ...

  8. Qt5窗口标题栏高度

    1.frameGeometry().height() - geometry().height() 2. QRect desktopRect = QApplication::desktop()-> ...

  9. Qt5 窗口内的控件随窗口大小自动变化

    http://www.bubuko.com/infodetail-827151.html 讲的很详细

随机推荐

  1. 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中

    自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...

  2. android linearlayout imageview置顶摆放

    在练习android时,想在Linearlayout内放一图片,使其图片置顶,预期效果是这样的: 但xml代码imageview写成这样后, <ImageView android:layout_ ...

  3. 使用client对象模型回写SharePoint列表

    使用client对象模型回写SharePoint列表 client对象模型是一个有效的方式回写SharePoint列表. 1. 管理员身份打开VS,新建WPF应用程序SPWriteListApp,确保 ...

  4. Spark源码阅读@ListenerBus 的实现

  5. SQL Server 自学笔记

    --★★★SQL语句本身区分大小写吗 --SQLServer 不区分大小写 --Oracle 默认是区分大小写的 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-2 ...

  6. 一个人的旅行(Dijkstra算法)

    这道题可用Dijkstra算法,好像还有floyd等算法,慢慢研究 Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途 ...

  7. BZOJ 1053 反素数ant

           初读这道题,一定有许多疑惑,其中最大的疑惑便是"反素数",反素数的概念很简单,就是,a<b同时a的因数个数大于b的因数个数.但是想要完成本题还需要一些信息,关于 ...

  8. C语言结构体变量内存分配与地址对齐

    地址对齐简单来说就是为了提高访问内存的速度. 数组的地址分配比较简单,由于数据类型相同,地址对齐是一件自然而然的事情. 结构体由于存在不同基本数据类型的组合,所以地址对齐存在不同情况,但总体来说有以下 ...

  9. 机器学习笔记(三)- from Andrew Ng的教学视频

    week four: Non-linear hypotheses:Neural Networks -->x1 and x2 x1 XNOR x2 ->a1->x1 and x2;a2 ...

  10. 笔记之Cyclone IV第一卷第三章器件中的存储器模块

    嵌入式存储器结构由一列列 M9K 存储器模块组成,通过对这些 M9K 存储器模块进行配置,可以实现各种存储器功能,例如:RAM.移位寄存器. ROM 以及FIFO 缓冲器. M9K 存储器模块支持以下 ...