QT基础操作

it2022-05-08  11

一、QT是一款跨平台的c++图形用户界面应用程序框架;

应用程序框架:封装好的各种类库,需要使用某种功能时,可以直接调用相应接口。

二、QT工程的创建

1.New Project ---> Application ---> QT Widgets Application ---> choose ---> 名称(不要包含中文名称) ---> 基类的选择;

基类:QMainWindow: 主要用于PC端,带菜单栏;

           QDialog: 对话框(不能伸缩);

           QWidget: 窗口控件(可以伸缩);

2、QT头文件特点:

头文件没有.h;头文件和类名一样;

均以Q开头,且前两个字母均大写;

3、两个控件之间需要指定父对象才会有联系,否则为两个独立的窗口,无任何联系;

指定父对象有两种方法:

obj.setParent(&Parent);  //指定obj的父类对象,将父类对象取址作为参数传入通过构造函数传参: QPushButton b(&Parent);

指定父对象的好处:只需父对象显示,上面的子对象就会自动显示。

4、信号与槽:QT对象之间通信的接口

connect(&b, &QPushButton::pressed, this, &Widget::close);

四个参数均为指针类型,第一个参数为信号发出者,第二个参数为要发送的信号,第三个参数为信号的接收者,第四个信号为槽函数,对接收到的信号做出相应的处理(可以是库函数,也可以是自己定义的函数)。

 

两个窗口切换实例:

主控窗口头文件:

widget.h

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include "subwidget.h" class Widget : public QWidget { Q_OBJECT //宏声明,信号与槽函数使用所需 private: QPushButton b1; subWidget w; public: Widget(QWidget *parent = 0); ~Widget(); void changWindow(); void deal(); }; #endif // WIDGET_H

子窗口头文件:

subwidget.h

#ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class subWidget : public QWidget { Q_OBJECT private: QPushButton b; public: explicit subWidget(QWidget *parent = 0); void sendslot(); signals: /* 信号必须由signals关键字声明(自定义信号) * 信号没有返回值,但可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用:emit MySignal(); */ void mysignal(); public slots: }; #endif // SUBWIDGET_H

main.cpp

#include "widget.h" #include <QApplication> //应用程序类 int main(int argc, char *argv[]) { QApplication a(argc, argv); //有且只有一个应用程序类的对象 Widget w; //继承于QWidget,QWidget是一个窗口基类,所以Widget也是窗口类 w.show(); //w就是一个窗口,创建的窗口默认隐藏,需要人为显示 return a.exec(); //等价于a.exec(); return 0; 作用:让程序一直执行,等待用户操作,即等待事件的发生 }

主窗口构造函数的实现:

widget.cpp

#include "widget.h" #include <QPushButton> Widget::Widget(QWidget *parent): QWidget(parent) { resize(400,300); //设置窗体大小 setWindowTitle("main"); //设置窗口名称,若不设置,默认为工程名 b1.setText("切换到子窗口"); //设置按键显示的名称 b1.setParent(this); //指定按键的父类 connect(&b1, &QPushButton::clicked, this, &changWindow); connect(&w, &subWidget::mysignal, this, &Widget::deal); //由于子类不含父类的对象,所以只能使用自定义信号建立联系,从子窗口切换回主窗口 Widget::~Widget() { } void Widget::changWindow() { hide(); w.show(); } void Widget::deal() { w.hide(); show(); }

子窗口构造函数的实现:

subwedget.cpp

#include "subwidget.h" subWidget::subWidget(QWidget *parent) : QWidget(parent) { resize(400,300); setWindowTitle("minor"); b.setText("切换到主窗口"); b.setParent(this); connect(&b, &QPushButton::pressed, this, &sendslot); } void subWidget::sendslot() { emit mysignal(); }

附:

信号可以带参数,可以重载:如:

void dealsub(); void dealslot(int, QString);

在调用connect函数时,为避免二义性,应定义对应类型的函数指针指向不同的信号,如:

//对于重载的信号,要定义相同类型的函数指针,让指针做connect的参数就可以避免二义性。 void (SubWidget::* signal_1)() = &SubWidget::MySignal; connect(&w,signal_1, this, &Widget::dealsub); void (SubWidget::* signal_2)(int, QString) = &SubWidget::MySignal; connect(&w,signal_2, this, &Widget::dealslot);

 


最新回复(0)