linux学习日记四——qt学习

       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.csdn.net/detail/u011348999/6890891


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值