当前位置: 首页 > news >正文

QT(2)Widget的小例子

  在上一次我们处理好了QT学习的环境,现在可以安安静静地去学习QT,可以参考http://doc.qt.nokia.com/latest/tutorials.html 。下面是step by step,创建我们的第一个QT小程序。

一、搭建一个QT程序

#include <QtGui>

/* In this example, we will test QApplication usage. */
int main(int argc, char *argv[])
{
/* 对于一个使用QT的GUI应用,无论是0个或者N个窗口,必须有一个QApplication的对象,而一个非GUI的QT应用,则使用QCoreApplication。他们之间的继承关系:QApplication -> QCoreApplication -> QObject */
QApplication app (argc, argv);

// ... 这里是程序的主体,我们在后面慢慢填充之...

return app.exec();
}

  创建一个QAppcliation对象,可以将命令行的参数传递过去。QApplication::exec()将唤起QT事件loop,这也是我们在main最后调用的函数。

二、创建一个窗口Windows

#include <QtGui>

/* In this example, we will test QApplication usage. */

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

QApplication app(argc, argv);
//如果一个widget创建是没有parent,这样将作为一个window或者一个top-level widget
QWidget window;

// Test 1: 显示Window,对于设置resize的情况,在MeeGo Handset IA32模拟器中是不生效的,Handset中认为所有的windows都是满屏,后面我将视这个window为panel,在上面加上其他组件。
window.resize (240,120);
window .setWindowTitle ("Test 1: Show Windows");
window.show();

return app.exec();
}

三、在Windows上加载Widget

#include <QtGui>

/* In this example, we will test QApplication usage. */

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

QApplication app(argc, argv);
QWidget window;

window.setWindowTitle("Test 2: Child Widgets");
window.show();


//我们采用QPushButton为例子:和不带parent创建windows不一样,button是一个windows的child,当windows destroy时,也将会被删除。注意隐藏和关闭windows是不会导致windows destroy的,但是程序结束可以。
QPushButton * button = new QPushButton ("Hello,world!",&window );
button -> move (100,100); //指定button的精确位置
button -> show ();

return app.exec();
}

四、采用layout加载Widget

  一般而言,在程序中,很少直接采用指定精确位置,一般layout的方式。

#include <QtGui>

/* In this example, we will test QApplication usage. */
int main(int argc, char *argv[])

{

QApplication app(argc, argv);
QWidget window;

window.setWindowTitle("Test 3: Using Layouts");
window.show();

//通常,子widget通过一个layout的对象进行排版,而不是直接精确地指定位置或者大小。这里我们采用QLable和输入框为例子,在创建的过程中,没有作为windows的子widget。
QLabel * label = new QLabel("Name:");
QLineEdit * lineEdit = new QLineEdit ();
QHBoxLayout * layout = new QHBoxLayout();

//Layout对象将管理在其上面的widget的位置和大小,通过addWidget()将widget加上。QHBBoxLayout的H表示水平方向。.
layout->addWidget (label);
layout->addWidget (lineEdit);

//而layout本身加入window通过调用setLayout()。windows加入layout后,则layout上的widget成为window的子widget.
window.setLayout(layout);

return app.exec();
}

五、多层次layout(同时演示QDebug和QList的使用方法)

#include <QtGui>
#include <QDebug> //QDebug是很重要的,可以打印QString(不能使用printf)

/* In this example, we will test QApplication usage. */
int main(int argc, char *argv[])
{

QApplication app(argc, argv);
QWidget window;

window.setWindowTitle("Test 4: Nested Layouts");
window.show();


//layout有QHBoxLayout和QVBoxLayout,分别是横向或者纵向。此外Qt还提供比较复杂的QGridLayout和QFormLayout。
QLabel * label = new QLabel("Name:");
QLineEdit * lineEdit = new QLineEdit ();

QTableView * resultView = new QTableView();

//上面的layout放置一个输入框,如同上一个例子。
QHBoxLayout * layout = new QHBoxLayout();
layout->addWidget(label);
layout->addWidget(lineEdit);

//创建一个纵向的layout, 上面放置一个layout(一 个输入框),通过addLayout (),下面放一个widget(表格)
QVBoxLayout * mainLayout = new QVBoxLayout();
mainLayout->addLayout (layout);
mainLayout->addWidget (resultView);
window.setLayout(mainLayout);


//下面这一部分,在表格( QStandardItemModel) 中加入 内容,并且学习一下QT的一些语句用法,学习QList的使用。QList 在内存方对象,这这个例子中,存放QStringList数组。在QT中在一个数组中加入一个entry采用“<<"的方式,如果继续加入,则继续“<<"。在表格中,每行有两个元素,放置在QStringList数组中,采用QStringList << "1" << "2" 。
QStandardItemModel * model = new QStandardItemModel();
model->setHorizontalHeaderLabels (QStringList() << "Name" << "Office"); //设置title
QList rows = QList()
<< (QStringList() << "Verne Nilsen" << "123")
<< (QStringList() << "Carlos Tang" << "77")
<< (QStringList() << "David Bradley" << "42")
<< (QStringList() << "Knut Walters" << "25")
<< (QStringList() << "Andrea Jones" << "34") ;

//从Qlist中取出数据,加入table中。每行使用append(),通过foreach从QList中依此读入 元素。由于每个元素是一个QStringList,因此两层嵌套的foreach来获取。
foreach (QStringList row, rows ) { //将rows的每个元素读入row
QList items;
printf("---------\n");
//用于对比QDebug的使用方式。
foreach(QString text, row){
qDebug() << "debug : " << text ; //显示qDebug的用法
items.append (new QStandardItem(text)); //在List中加入entry
}
model->appendRow (items);
}

resultView->setModel(model);
resultView->verticalHeader()->hide(); //如果不设置行列的名称,缺省为1,2,3,...,这个可以隐藏这些行列的名称
resultView->horizontalHeader()->setStretchLastSection(true); //将每行最后一个entry,填满空间

return app.exec();
}

相关链接:我的MeeGo/Moblin相关文章

相关文章:

  • Xcode7 添加PCH文件
  • MySQL事务隔离级别详解(转)
  • 登陆的时候如何用单例将用户登录成功后的信息存储下来,并且在其他地方可以使用...
  • linux2.6.36之后对工作队列的改进
  • FPM打包工具
  • 随笔一个dom节点绑定事件
  • 程序员的美:极致与疯狂
  • 大脑暗能量
  • 2013551813 张燕燕 第二周作业
  • 一个7200转/分钟,20G的给力风扇
  • 页面刷新 整个页面刷新和局部刷新
  • 如何编译MFDeploy
  • 系统设计
  • QT(3)对象和继承-Addressbook例子1
  • 很想写些CMMI的东西
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 10个确保微服务与容器安全的最佳实践
  • 10个最佳ES6特性 ES7与ES8的特性
  • angular2 简述
  • Cumulo 的 ClojureScript 模块已经成型
  • js对象的深浅拷贝
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Odoo domain写法及运用
  • QQ浏览器x5内核的兼容性问题
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SQL 难点解决:记录的引用
  • 工作手记之html2canvas使用概述
  • 警报:线上事故之CountDownLatch的威力
  • 聊聊hikari连接池的leakDetectionThreshold
  • 深入浏览器事件循环的本质
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用Gradle第一次构建Java程序
  • 微信开源mars源码分析1—上层samples分析
  • 一个SAP顾问在美国的这些年
  • 在Docker Swarm上部署Apache Storm:第1部分
  • gunicorn工作原理
  • ​TypeScript都不会用,也敢说会前端?
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (04)odoo视图操作
  • (4)(4.6) Triducer
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (蓝桥杯每日一题)love
  • (学习日记)2024.01.19
  • (一)u-boot-nand.bin的下载
  • (转)jQuery 基础
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .sh
  • ::什么意思
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [bbk5179]第66集 第7章 - 数据库的维护 03