Qt学习之路MainWindow学习过程中的知识点
一、Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow

二、QAction类
QAction类保存有关于这个动作,也就是action的信息,比如它的文本描述、图标、快捷键、回调函数(也就是信号槽),等等。神奇的是,QAction能够根据添加的位置来改变自己的样子——如果添加到菜单中,就会显示成一个菜单项;如果添加到工具条,就会显示成一个按钮。
把QAction添加到菜单和工具条上:
QAction *openAction; openAction = new QAction(tr("&Open"),this); openAction->setShortcut(QKeySequence::Open); openAction->setStatusTip(tr("Open a file."));
QAction:
QAction(const QString &text, QObject* parent);第一个text是这个动作的文本描述,用来显示文本信息;第二个是parent,它的作用是指明这个QAction的父组件,当这个父组件被销毁时,与其相关联的这个QAction也会自动被销毁。
shortcut是这个动作的快捷键。
setStatusTip函数。这是添加状态栏的提示语句
QMenu *file = menuBar()->addMenu(tr("&File")); file->addAction(openAction);
QToolBar *toolBar = addToolBar(tr("&File")); toolBar->addAction(openAction);
第一句menuBar()函数返回一个菜单栏指针,addMenu()函数添加一个菜单,菜单栏指针调用addMenu()函数把菜单添加到菜单栏中。
第二句菜单栏指针调用addAction()函数将QAction对象添加到菜单中使QAction成为一个菜单项(QAction能够根据添加的位置来改变自己的样子——如果添加到菜单中,就会显示成一个菜单项).
第三句addToolBar()函数添加一个工具栏返回这个工具栏的指针,addAction()函数将QAction对象添加到工具栏中使其成为一个工具项(一个按钮,如果添加到工具条,就会显示成一个按钮)
三、利用资源文件给菜单项和工具条按钮添加图标
添加图标。QAction的图标会显示在菜单项的前面以及工具条按钮上面显示
openAction->setIcon(QIcon(":/Open.png"));
使用setIcon添加图标,添加的类是QIcon,构造函数需要一个参数,是一个字符串。由于我们要使用qrc中定义的图片,所以字符串以 : 开始,后面跟着prefix,因为我们先前定义的prefix是/,所以就需要一个/,然后后面是file的路径。
为QAction添加事件响应
private slots:
void open(); 因为我们的open()目前只要在类的内部使用,因此定义成private slots即可。
connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
triggered()信号:
这个信号时产生一个动作是由用户激活;例如,当用户单击一个菜单选项,工具栏按钮或按操作的快捷键组合,或当trigger()函数调用时。值得注意的是, 当setChecked() or toggle() 被调用时,信号不发射。
void MainWindow::open()
{
QMessageBox::information(NULL, tr("Open"), tr("Open a file")); }
四、状态栏
状态栏位于主窗口的最下方,提供一个显示工具提示等信息的地方。一般地,当窗口不是最大化的时候,状态栏的右下角会有一个可以调节大小的控制点;当窗口最大化的时候,这个控制点会自动消失。Qt提供了一个QStatusBar类来实现状态栏。QMainWindow类里面就有一个statusBar()函数,用于实现状态栏的调用。类似menuBar()函数,如果不存在状态栏,该函数会自动创建一个,如果已经创建则会返回这个状态栏的指针。如果你要替换掉已经存在的状态栏,需要使用QMainWindow的setStatusBar()函数。
在Qt里面,状态栏显示的信息有三种类型:临时信息、一般信息和永久信息。
QStatusBar继承自QWidget,因此它可以添加其他的QWidget。
private:
QAction *openAction;
QLabel *msgLabel
在其构造函数中添加:
msgLabel = new QLabel;
msgLabel->setMinimumSize(msgLabel->sizeHint());
msgLabel->setAlignment(Qt::AlignHCenter);
statusBar()->addWidget(msgLabel);
第一行创建一个QLabel的对象,然后设置最小大小为其本身的建议大小,这样设置之后,这个最小大小可能是变化的——最后设置显示规则是水平居中(HCenter)。最后一行使用statusBar()函数将这个label添加到状态栏。
我们很快发现一个问题:当没有任何提示时,状态栏会有一个短短的竖线:
其实,这是QLabel的边框。当没有内容显示时,QLabel只显示出自己的一个边框。但是,很多情况下我们并不希望有这条竖线,于是,我们对statusBar()进行如下设置:
statusBar()->setStyleSheet(QString("QStatusBar::item{border: 0px}"));//把QStatusBar的子组件的border设置为0,也就是没有边框
QStatusBar右下角的大小控制点可以通过setSizeGripEnabled()函数来设置是否存在.
由于QStatusBar可以添加多个QWidget,因此,我们可以构建出很复杂的状态栏。
五、Qt的标准对话框之QFileDialog
QFileDialog是Qt中用于文件打开和保存的对话框
这种方法是使用静态函数的方法来创建一个文件打开对话框
void MainWindow::open()
{
QString path = QFileDialog::getOpenFileName(this, tr("Open Image"),".", tr("Image Files(*.jpg *.png)"));
if(path.length() == 0) {
QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
}else {
QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path);
}
}
QFileDialog提供了很多静态函数,用于获取用户选择的文件。这里我们使用的是getOpenFileName(), 也就是“获取打开文件名”
Qt提供了另外的写法:
QFileDialog *fileDialog =new QFileDialog(this);
fileDialog->setWindowTitle(tr("Open Image"));
fileDialog->setDirectory(".");
fileDialog->setFilter(tr("Image Files(*.jpg *.png)"));
if(fileDialog->exec() == QDialog::Accepted) {
QString path = fileDialog->selectedFiles()[0];
QMessageBox::information(NULL, tr("Path"), tr("You selected ") + path);
}else {
QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
}
QString QFileDialog::getOpenFileName (我们已经能够选择打开文件了。保存也是类似的,QFileDialog类也提供了保存对话框的函数getSaveFileName(),具体使用还是查阅API.
六、Qt的标准对话框之QColorDialog
使用QColorDialog也很简单,Qt提供了getColor()函数,类似于QFileDialog的getOpenFileName(),可以直接获得选择的颜色。
QColor color = QColorDialog::getColor(Qt::white,this);
QString msg = QString("r: %1, g: %2, b: %3").arg(QString::number(color.red()), QString::number(color.green()), QString::number(color.blue()));
QMessageBox::information(NULL,"Selected color", msg);第一行QColorDialog::getColor()调用了QColorDialog的static函数getColor()。这个函数有两个参数,第一个是QColor类型,是对话框打开时默认选择的颜色,第二个是它的parent。
第二行比较长,涉及到QString的用法,QString("r: %1, g: %2, b: %3")创建了一个QString对象。我们使用了参数化字符串,也就是那些%1之类。其实这都是一些占位符,也就是,后面会用别的字符串替换掉这些值。占位符的替换需要使用QString的arg()函数。这个函数会返回它的调用者,因此可以使用链式调用写法。它会按照顺序替换掉占位符。然后是QString::number()函数,这也是QString的一个static函数,作用就是把int、double等值换成QString类型。这里是把QColor的R、G、B三个值输出了出来。
QColorDialog::setCustomColor()可以设置用户自定义颜色。这个函数有两个值,第一个是自定义颜色的索引,第二个是自定义颜色的RGB值,类型是QRgb
QColorDialog::setCustomColor(0, QRgb(0x0000FF));getColor()还有一个重载的函数,签名如下:
QColorDialog::getColor(const QColor & initial, QWidget * parent, const QString & title, ColorDialogOptions options = 0 )七、Qt标准对话框之QMessageBox
QMessageBox::information
QMessageBox::information(NULL,"Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
API中看看它的函数签名:
static StandardButton QMessageBox::information ( QWidget * parent,const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton );
QMessageBox::critical(NULL,"critical", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::warning(NULL,"warning", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::question(NULL,"question", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
QMessageBox::about(NULL,"About", "About this application");
QMessageBox::about(NULL,"About", "About this <font color='red'>application</font>");
QMessageBox message(QMessageBox::NoIcon,"Title", "Content with icon.");
message.setIconPixmap(QPixmap("icon.png"));
message.exec();需要注意的是,同其他的程序类似,我们在程序中定义的相对路径都是要相对于运行时的.exe文件的地址的。比如我们写"icon.png",意思是是在.exe的当前目录下寻找一个"icon.png"的文件。这个程序的运行效果如下:

QMessageBox::StandardButton rb = QMessageBox::question(NULL,"Show Qt", "Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes)
{
QMessageBox::aboutQt(NULL,"About Qt");
}
QMessageBox message(QMessageBox::NoIcon,"Show Qt", "Do you want to show Qt dialog?", QMessageBox::Yes | QMessageBox::No, NULL);
if(message.exec() == QMessageBox::Yes)
{
QMessageBox::aboutQt(NULL,"About Qt");
}八、Qt标准对话框之QInputDialog
QInputDialog用于接收用户的输入。QInputDialog提供了一些简单的static函数,用于快速的建立一个对话框
bool isOK;
QString text = QInputDialog::getText(NULL,"Input Dialog",
"Please input your comment",
QLineEdit::Normal,
"your comment",
&isOK);
if(isOK) {
QMessageBox::information(NULL,"Information",
"Your comment is: <b>" + text +"</b>",
QMessageBox::Yes | QMessageBox::No,
QMessageBox::Yes);
}
static QString QInputDialog::getText ( QWidget * parent,Qt学习之路MainWindow学习过程中的知识点的更多相关文章
- Qt 学习之路 2(7):MainWindow 简介
Qt 学习之路 2(7):MainWindow 简介 豆子 2012年8月29日 Qt 学习之路 2 29条评论 前面一篇大致介绍了 Qt 各个模块的相关内容,目的是对 Qt 框架有一个高屋建 ...
- Qt 学习之路 2(71):线程简介
Qt 学习之路 2(71):线程简介 豆子 2013年11月18日 Qt 学习之路 2 30条评论 前面我们讨论了有关进程以及进程间通讯的相关问题,现在我们开始讨论线程.事实上,现代的程序中,使用线程 ...
- Qt 学习之路 2(70):进程间通信
Qt 学习之路 2(70):进程间通信 豆子 2013年11月12日 Qt 学习之路 2 16条评论 上一章我们了解了有关进程的基本知识.我们将进程理解为相互独立的正在运行的程序.由于二者是相互独立的 ...
- Qt 学习之路 2(67):访问网络(3)
Qt 学习之路 2(67):访问网络(3) 豆子 2013年11月5日 Qt 学习之路 2 16条评论 上一章我们了解了如何使用我们设计的NetWorker类实现我们所需要的网络操作.本章我们将继续完 ...
- Qt 学习之路 2(66):访问网络(2)
Home / Qt 学习之路 2 / Qt 学习之路 2(66):访问网络(2) Qt 学习之路 2(66):访问网络(2) 豆子 2013年10月31日 Qt 学习之路 2 27条评论 上一 ...
- Qt 学习之路 2(61):使用 SAX 处理 XML
Qt 学习之路 2(61):使用 SAX 处理 XML 豆子 2013年8月13日 Qt 学习之路 2 没有评论 前面两章我们介绍了使用流和 DOM 的方式处理 XML 的相关内容,本章将介绍 ...
- Qt 学习之路 2(60):使用 DOM 处理 XML
Qt 学习之路 2(60):使用 DOM 处理 XML 豆子 2013年8月3日 Qt 学习之路 2 9条评论 DOM 是由 W3C 提出的一种处理 XML 文档的标准接口.Qt 实现了 DO ...
- Qt 学习之路 2(59):使用流处理 XML
Qt 学习之路 2(59):使用流处理 XML 豆子 2013年7月25日 Qt 学习之路 2 18条评论 本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible ...
- Qt 学习之路 2(53):自定义拖放数据
Qt 学习之路 2(53):自定义拖放数据 豆子 2013年5月26日 Qt 学习之路 2 13条评论上一章中,我们的例子使用系统提供的拖放对象QMimeData进行拖放数据的存储.比如使用QM ...
随机推荐
- 如何使用 Weave 网络?- 每天5分钟玩转 Docker 容器技术(63)
weave 是 Weaveworks 开发的容器网络解决方案.weave 创建的虚拟网络可以将部署在多个主机上的容器连接起来.对容器来说,weave 就像一个巨大的以太网交换机,所有容器都被接入这个交 ...
- 一文教你迅速解决分布式事务 XA 一致性问题
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云数据库团队 近日,腾讯云发布了分布式数据库解决方案(DCDB),其最明显的特性之一就是提供了高于开源分布式事务XA的性能.大型 ...
- Spring详解(四)------注解配置IOC、DI
Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...
- 对Appium的认识 get
介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台测试.Appium使用WebDriver的json w ...
- LVDS/RGB转EDP稳定方案----NCS8801S
目前山寨平板市场已经进入白热化,同质化的竞争.厂商的利润被压得非常的薄.一味的价格战肯定会带来行业洗牌.差异化是许多厂商的选择,而其中一条重要的路子,就是采用高分辨率的down-grade屏.如苹果的 ...
- 【JCP模式实战--ferrous-framework】ferrous前端开发框架邀您初体验
一.简介 ferrous-framework是为了迎合微服务架构而封装的纯前端开发框架. 实现了一种介于单页面和多页面的开发模式,让大家根据自己的需要对单页面和多页面进行切换或者共存. 页面结构采用J ...
- JavaScript学习日志(六):事件
这篇随笔,深恶痛绝,敲到快结束的时候,凌晨00:19,突然闪退,也不知道是Mac的原因还是chrome的原因,重新打开的时候,以为自动保存有效果,心想没关系,结果他么的只保存了四分之一,WTF?!!! ...
- 从概念到业务来看 To B 和 To C 产品区别在哪?
自从互联网火了以后,一大堆 o2o,b2b,c2c 的产品出现,这些名词也渐渐为人熟知,但很多人对这些产品的理解也是停留在概念上,实际上绝大部分人用的都是 To C(也写作2c)产品,比如微信,qq ...
- 个人作业3——个人总结(Alpha阶段)
个人总结 Alpha阶段总结: 起初关于手机app的开发真的一无所知,选了一条较远的路走(使用 Android Studio 来开发 Android 应用更加方便,而我们选用 Eclipse 开发 A ...
- 集美大学网络1413第十四次作业成绩(团队九) -- 测试与发布&博客展示(Beta版本)
题目 团队作业9--测试与发布(Beta版本) 团队作业9成绩 团队/分值 Beta版本测试报告 Beta版本发布说明 总分 Bug类别. 数量 场景测试 测试结果 测试矩阵 出口条件 ...