一个默默耕耘的工程师…
所有的控件都时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