您的位置:首页 > 运维架构 > Linux

linux学习日记四——qt学习

2014-10-19 16:27 155 查看
qt学习也是自己从网上随便找的。

两个

C++ Qt 编程视频教程1~7http://down.51cto.com/data/1033133

好多集英文原版视频教程,正在冰与火的炼狱中




QT学习之路:从入门到精通

http://blog.51cto.com/zt/20/1/

这位大大挺厉害的,正在慢慢蚕食这个程序猿大大的微博。

先说一下我现在对于学QT的看吧!

对于界面编程:我们看程序是,应当在脑中脑补一个显示屏,看到不同的代码时,就在脑海中画对话框,控件,按钮啥的。

程序看完,整个界面应当就脑补出来了,最好还是动态的,不同输入时可以,脑补不同交互反应。

界面做了几天 做得想吐。

把自己遇到的几个要点记录一下,方便以后查看:

Qt控件的爸爸QWidget是什么?

QWidget就是一块带参数的矩形区域。

一、QT查看系统状态信息。

已知在shell命令行下可以通过cat命令查看设备信息。

cat /proc/acpi/battery/BAT1/state 查看电量

可以通过QFile类读取文件信息

QFile
file("/proc/acpi/battery/BAT1/state");

时间信息可以QDateTime读取

QDateTime dt = QDateTime::currentDateTime();

QDate date = dt.date();

QTime time = dt.time();

通过QTimer做一秒线程的刷新显示。

二、键盘鼠标事件。

键盘事件通过重载QWidget的成员函数keyPressEvent(QKeyEvent
*event)。

protected:

void keyPressEvent(QKeyEvent *);

用event->key()来获得键值,判断于
Qt::Key_Enter,Key_S,Key_Left


是否相等。

鼠标事件重载QWidget的成员函数

void mouseMoveEvent(QMouseEvent *event);

void mousePressEvent(QMouseEvent *event);

void mouseReleaseEvent(QMouseEvent *event);


可以通过它们emit signal()让其他槽函数来响应对应的signal。

三、制作旋转动画。

参考文献:

Qt学习之路(24): QPainter http://devbean.blog.51cto.com/448512/235332
[b]Qt学习之路(28): 坐标变换 http://devbean.blog.51cto.com/448512/239585[/b]
背景知识:

画图要在一个QWidget上画,因此要在MainWindow上新建一个QWidget,已知MainWindow类是Qwidget的子类。问题变成在一个QWidget上建立一个QWidget.

方法两种:

一:

DetectingSmallWidget = new PaintedWidget(centralWidget);

DetectingSmallWidget->setGeometry(QRect(85, 130, 72, 72));

在一个QWidget上new一个新的,要指明新的区域大小。

二:建一个过渡的QLayout ;

QLayout *layout = new QxxxLayout;

layout->addWidget(new_widget);

oldwidget->setLayout(layout);

由于paintEvent(QPaintEvent
*event)是重载QWidget的函数,故要派生一个新类PaintedWidget,在它的paintEvent()函数里进行画图。

设想:

实现在QWidget区域中画一个圆盘让圆盘绕着中心旋转?

在参考文献中知道坐标系旋转是以QWidget的左上角为原点的。则旋转中心在原点而不是圆盘中心。

设原坐标系正交基为(i,j),旋转后坐标系正交基(k,l),过渡矩阵为A,有(k,l) = (i,j)*A;

A = cos(theta) -sin(theta)

sin(theta) cos(theta)

空间一点M有在(i,j)坐标为(x1,y1)T ,在(k,l)坐标为(x2 y2)T,有(x2 y2)T = A^(-1)*(x1,y1)T;

OM = (i,j)*(x1,y1)T = (i,j)*A*A^(-1)*(x1,y1)T = (k,l)*A^(-1)*(x1,y1)T = (k,l)*(x2 y2)T;

故在原坐标系圆心为(x1,y1),坐标旋转后圆心应该放在(x2,y2)则在原图形的物理位置没有改变,同时实现旋转效果。

附代码:

void PaintedWidget::paintEvent(QPaintEvent *event)

{

angle_theta += 25;

if(angle_theta >= 360)

angle_theta -= 360;

QPainter painter(this);

QPixmap pix;

pix.load(":/resources/ExDetectPage/DetectImg/detect.png");

// painter.drawText(60, 60, "Hello, world!");

float theta = angle_theta/180*M_PI;

float x1,y1,x2,y2;

x1 = 360;

y1 = 360;

//    painter.drawPixmap(x1-36,y1-36,72,72,pix);

x2 = cos(theta)*x1 + sin(theta)*y1;

y2 = -sin(theta)*x1 + cos(theta)*y1;


QTransform transform;

transform.rotate(angle_theta);

painter.setWorldTransform(transform);

painter.drawPixmap(x2/10-35.5,y2/10-35.5,72,72,pix);

//   qDebug()<<angle_theta;

}


最后通过定时器来刷新,注意:

paintEvent函数不能直接调用,应该用QWidget->update()刷新来调用。

四、关于Qt一小点类关系问题:

ui_mainwindow.h中

namespace Ui {

class MainWindow: public Ui_MainWindow {};

} // namespace Ui

意思是说:在Ui命名空间中有一个类MainWindow以public方式继承Ui_MainWindow。类中没有任何代码。


private:

Ui::MainWindow *ui;

};

MainWindow.h中定义MainWindow类继承QMainWindow类,有一个私有成员是Ui空间的类MainWindow。此MainWindow非彼MainWindow。

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

}


这是MainWindow的构造函数,将parent参数传给父类QWidget,同时new一个Ui:MainWindow给ui指针。

在构造函数中写 ui = new Ui::MainWindow 也可以,不清楚两种写法有何不同。



附基本类继承关系图一张,

所有类继承关系下载网址一个。


Qt5类继承关系图

http://download.csdn.net/detail/u011348999/6890891

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: