【专题7:qt上位机详解】 之 【5.QWidget1】

一个默默耕耘的工程师…

各专题目录
【专题1:工作两年再学嵌入式】
【专题2:freertos系统详解】
【专题3:从0到1写嵌入式操作系统】
【专题4:直流无刷电机控制】
【专题5:从0到1写bootloader、iap升级和产品量产】
【专题6:mcu硬件电路设计】
【专题7:qt上位机详解】
【专题8:linux应用及qt移植】
【专题9:从linux内核借鉴写代码的思路】
【专题10:面向对象和事件驱动】
【专题11:从0到1开发仪表】
【专题12:常用复杂模块从0到1】
【专题13:读书笔记】

  所有的控件都时QWidget的子类。QWidget的方法会用了,绝大部分的控件的方法也基本会用了。

1.坐标

在这里插入图片描述
  X轴是向右增大,譬如屏幕分辨率是1920*1080,那么X轴就是从0增大到1920。Y轴就iu是从0增大到1080。绝对坐标是相对于整个屏幕的坐标,相对坐标是相对于父控件的坐标。

2.线程

QT创建线程的步骤:

(1)自己写一个A类,继承QThread线程类。

(2)重写void run(){}线程函数。

(3)创建一个A类的对象,通过该对象调用start()函数,该线程就会被运行,即run函数会被运行。

(4)注意,有一个stop()函数可以停止线程,但是不建议这么做,因为一个线程在执行时,突然被终止,很有可能带来一些无法预知的错误。一般都是在run函数的内部来结束线程(线程处理完之后,通过一个if判断来自己结束自己),线程退出后,它的所有资源也就释放了。

3.创建一个QWidget界面对象

QWidget w;
w.show();//显示窗体(包含子窗口),show函数也是一个槽函数,意味着它也由主线程信号槽轮询来处理。
w.hide();//隐藏窗体(包含子窗口),也是一个槽函数。

  也可以直接new出来,并且可以传递一个父窗体,QWidget w(QWidget A对象),表示新创建的w对象会在QWidget A窗体中显示。

4.QWidget窗口的坐标和尺寸

(1)获得坐标

QRect geometry()

  通过geometry可以得到窗体的左上角的坐标以及宽高。QRect里面包含了左上角的坐标和宽高等很多信息。
在这里插入图片描述
(2)设置坐标

void setGeometry(int x, int y, int w, int h);
void setGeometry(const QRect &);

(3)单独得到宽或高

x():得到窗口左上角原点x轴坐标。
y():得到窗口左上角原点y轴坐标。
widget():得到窗口的宽度。
height():得到窗口的高度。
move(x, y):移动窗口。
resize(width, height):改变窗体大小。

5.案例:让窗口每隔一秒钟向右下角移动10个像素点。

  如果直接在主线程中通过for循环来移动,会导致:当for循环在运行时,界面是不能点的情况。所以需要创建一个子线程,在子线程用移动窗口,但子线程又不能直接修改/更新界面,所以需要用到信号与槽。子线程需要移动窗口时,就发一个信号,在定义一个槽函数,用来处理该信号,在槽函数中调用移动窗口的函数。

  控件的某些函数本身就是槽函数,可以直接和信号进行绑定;如果控件的函数a不是槽函数,可以自己定义一个名字为a的槽函数,在槽函数中调用函数a。
(1)main.c

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    MyThread xt;
    QObject::connect(&xt, SIGNAL(Move(int, int)), &w, SLOT(move(int, int)));
    xt.start();

    return a.exec();
}

(2)自定义的线程类
①头文件

class MyThread : public QThread
{
    Q_OBJECT

public:
    MyThread();
    void run()
    {
        int x = 0;
        for (x = 0; x < 1000; x++) {
           Move(x+10, x+10);
           qDebug()<<"run..."<<endl;
           msleep(1000);
        }
    }
signals:
    Move(int x, int y);
};

②Cpp文件

#include "mythread.h"

MyThread::MyThread()
{

}

(3)窗口widget类
①头文件

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
public slots:
    void move(int x, int y);
};

②Cpp文件

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::move(int x, int y)
{
    QWidget::move(x, y);
}

注:
  如果调用信号函数时出现undefined reference to “xxx”,解决方法:这是需要重新生成qmake:build —>run qmake

猜你喜欢

转载自blog.csdn.net/qq_29083043/article/details/106336517
今日推荐