Skip to content →

Tag: Qt

Qt画图

Qt提供了一个QPainter来画图,可以用来绘制矢量图,也可以用来装载图片。今天实现的是一个给照片加边框的功能,为了练习,将PicFrame构造成一个继承自QWidget的自定义Widget。这时QPainter不能直接在自己定义的Widget中使用,而需要在paintEvent(QPaintEvent *event)中实现,否则会有类似于“QPainter::begin: Paint
device returned engine == 0, type: 1”的错误消息出现。

void PicFrame::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QRect rect(0, 0, image.width()*(1+frameSize), image.height()*(1+frameSize));
    painter.fillRect(rect,color);
    QPoint point(frameSize*image.width()/2, frameSize*image.height()/2);
    painter.drawImage(point, image);
}

=============================心情分割线=============================

今天NordSec2010开始,又见到了很多老朋友。再聚首总是有很多要交流的,大家都在为毕设发愁,都在为前途迷茫。从来没有像现在这样反感学术,当初不去美国的决定似乎是对的。

Leave a Comment

一步一脚印

咱虽然笨,一步一步慢慢来还不行么。

用正则表达式改进了昨天的计算器,用来限制用户输入。

regExp.setPattern("^\\d*.?\\d+[\\+\\-\\*\\/]\\d*.?\\d+$");
lineEdit->setValidator(new QRegExpValidator(regExp,this));

因为这个匹配模式是字符串,而字符串中”是转义字符,所以’d’放到字符串中就应该写成’\d’。类似的,如果要匹配一个”,则应该写成’\\’。

另外今天还写了个记事本,实现了最基本的打开,修改,保存和修改字体功能。Qt
Designer用的不太熟,于是手工添加控件,那叫一个麻烦。基本控件大致了解了,对文件的操作还不熟。中间由于把保存文件的对话框写成了打开文件的对话框而导致一直不能保存文件,原来这两个还不一样,虽然长得很像,汗。

QString filename = QFileDialog::getOpenFileName(this, tr("Open file"), ".", tr("Text files (*.txt)"));
QString filename = QFileDialog::getSaveFileName(this, tr("Save text file"), ".", tr("Text files(*.txt)"));

对Signal-Slot机制的了解基本到了可以用的程度,但是对于中间的参数传递过程还一无所知。明天继续。

=============================心情分割线=============================

最近一直比较抑郁,算来差不多郁闷了将近二十年了。当然中间也会有间歇性的亢奋,但总体来说太微不足道了。以前总是对过去恋恋不舍,对未来不知所措,对当下却不能把握。总是过于重视别人的看法,过多的考虑别人的感受。从来不知道自己需要什么,现在回首看看,自己竟然不认识自己。

于是我打算跟自己一刀两断,我从今天开始就是我而且只是我,不再在乎他人的评价,不去关心我不愿关心的人和事,只做自己想做的事情。锲而不舍,勇往直前,纵然头破血流也在所不惜。不是做回自己,因为以前的我没有自己。

这几天一直听李宗盛,把他的四首歌翻来覆去的听。他那沙哑的声音切割者我的心,想哭却无法从干枯的眼睛中挤出半滴泪水。真爱难寻,我会继续等待,孤傲的常驻于此。直到你出现在我面前,I’ll love as if I’ve never been in love before.

思维之混乱,阅者了然。

Leave a Comment

千里之行

用Qt写计算器,花了我一个晚上终于写出来一个能用的了,能赶上大二学Java时写计算器的速度了。

用Qt Designer设计界面比较方便,用熟之后效率会更高。把界面设计好之后可以通过继承的方式给自己的类添加逻辑。如果设计的界面保存为mycaculator.ui的话,uic将会自动将这个XML文件转换成ui_mycaculator.h,其中的namespace为Ui。

#include"ui_mycaculator.h"
class Caculator : public QMainWindow, public Ui::MyCaculator

另外,Qt对字符串的处理简直跟Java一样了:

QString s1 = expStr.split(QRegExp("[+-*/]"))[0]; 
QString s2 = expStr.split(QRegExp("[+-*/]"))[1];
double d1 = s1.toDouble();
double d2 =s2.toDouble();
resStr = QVariant(d1+d2).toString();
expStr.append(resStr);

总算是迈出了第一步,再接再厉。

更新:上面的正则表达式不对,因为’+’, ‘-‘和’*’在正则表达式中有特殊意义。应该为如下:

QString s1 = expStr.split(QRegExp("[\\+\\-\\*/]"))[0];
QString s2 =expStr.split(QRegExp("[\\+\\-\\*/]"))[1];
double d1 = s1.toDouble();
double d2 = s2.toDouble();
resStr = QVariant(d1+d2).toString();
expStr.append(resStr);
Leave a Comment

立志

毕业在即,前途未卜。不是没有动力,是实在不知道自己该干什么好。前几天连续看了几天的Android开发,从昨天开始又开始看Qt,自己已经迷茫的手足无措了。

但是不管做什么,只要能做好,就不会有任何问题。重要的不是做什么,而是我愿意花多少精力来做这件事情。

所以从今天起,给自己一个目标,然后矢志不渝的坚持下去。不再给自己任何借口,不要心存侥幸,不要有一丝恐慌。踏踏实实,一心一意的奋斗,不管前路如何艰险,我只顾走好眼前一步。

从今开始,用所有精力去完成一件事情:学习Qt。具体规划表:

25/10/2010–07/11/2010 参考C++ GUI Programming with Qt 4
学习Qt,顺便复习C++语言。理解Qt各种类的使用方法,每天必须保证至少200行的代码量,中途不准间断。
07/11/2010–21/11/2010 第一个Qt项目的详细规划,包括详细设计,严格按照软件工程方法做好前期工作。
21/11/2010–17/12/2010 第一个Qt项目的编码和测试,以开源方式发布。严格按照计划进行,宁可考试挂科也不能放弃执行自己的项目。
20/12/2010–17/01/2011 对上一个项目进行总结,给自己充电,阅读理解An
Introduction to Design Patterns in C++ with Qt 4。同时启动第二个Qt项目,做好详细规划。
18/01/2011–10/02/2011 第二个Qt项目的编码和测试,以开源方式发布。严格按照计划进行,宁可不做毕业设计也不能放弃执行自己的项目。

铁了心去干一件事情,拿出破釜沉舟的勇气来,就像两年前一样。

Leave a Comment

Qt学习:简介和信号与槽机制

以前以为Qt比较麻烦,今天看了一下,发现它其实不比Java难。

首先Qt有非常详细的文档。这个对于开发者来说是十分重要的,纵览现在的流行开发平台,不管是Java,还是微软的平台,都有为开发人员提供详实的文档和指南。如果没有文档支持,开发过程会相当痛苦。这一点我深有体会,前段时间用libpcap写点儿小程序,这个库的所有文档就是一页man page,我甚至不知道某个函数的参数到底是什么类型。

其次,Qt的跨平台性能不输Java。Qt现在支持大多数桌面平台,Windows,Linux和Unix,Mac,手机平台上面的应用也已经成熟。开发者不用更改一行代码,就可以使自己的应用程序运行在每一个操作系统中。

还有,Qt被Nokia收购之后推出了配套的IDE,Qt Creator。这个IDE强大且美观,包含方便的图形界面设计工具,图形化调试工具,手机界面模拟器以及多样化的版本控制工具支持。

总体来说,Qt的易用性是不错的,易于上手,易于开发;但是至于性能,包括速度和安全性,我目前还没有一个清晰地认识。但我相信Nokia里面的那帮人会不断想方设法的提升Qt性能的,毕竟Nokia现在手里的王牌也只有这个了。

Qt之中提供了方便的消息传递机制:信号和槽机制(Signals and Slots),这也是Qt的核心机制,用于对象之间的通信。他的格式如下:

connect(Object1, SIGNAL(signal), Object2, SLOT(slot));

当Object1的信号被触发时,Object2的相应槽就会给以相应。当然,上面只是信号与槽的一种连接方式,其他方式还可能是:
一个信号与另外一个信号相连,即一个信号触发另外一个信号:

connect(Object1, SIGNAL(signal1), Object2,
SIGNAL(signal2));

一个信号与多个槽相连:

connect(Object1, SIGNAL(signal), Object2, SLOT(slot1));
connect(Object1, SIGNAL(signal), Object3, SLOT(slot2));

同样的,一个槽也可以响应多个信号:

connect(Object1, SIGNAL(signal1), Object2, SLOT(slot));
connect(Object3, SIGNAL(signal3), Object2, SLOT(slot));

简单的例子:

#include
#include

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton b("Quit");
    b.show();
    QObject::connect(&b, SIGNAL(clicked()), &app, SLOT(quit()));
    return app.exec();
}
Leave a Comment