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
Qt学习之路(28): 坐标变换 http://devbean.blog.51cto.com/448512/239585
背景知识:
画图要在一个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.youkuaiyun.com/detail/u011348999/6890891