1. Widget控件相关
自定义窗口类名为“MainWidget”,窗口名为“w”,按钮名为“bn”
MainWidget w;//创建对象
w.resize(500,500);//调整窗口大小
w.setWindowTitle("...");//设置窗口名
w.show();//显示控件(控件默认隐藏)
w.hide();控件隐藏
w.close();控件关闭
2. PushButton控件相关
#include<QPushButton>
QPushButton b1;
QPushButton *b2,*b4;
b2=new QPushButton;//创建按钮对象
b1.setParent(*w);
QPushButton b3(*w);
b4=new QPushButton(*w);//指定父对象,否则是独立控件
b1.setText("...");//设置按钮内容
b1.move(100,100);//设置按钮位置
3. 信号与槽的连接
connect(&b1,$QPushButton::pressed,$w,$MainWidget::close);
信号类型有:按下pressed,点击clicked,弹起released
4. 自定义槽函数
在需要的位置编写自定义函数作为信号的“回应”,修改connect函数的后两个参数即可
5. 自定义信号
在需要发出信号的控件.h的signals声明中添加信号 void MySignal();
在需要信号发出的位置自定义函数用于发出信号,函数体中调用MySignal();(信号也是函数)
触发信号与发出信号的函数进行connect
在接受信号的位置将接收信号与槽函数进行connect
带参数的信号见程序
6. Lambda表达式
见程序subwidget.cpp
7. 实例程序
main.cpp:
#include "mainwidget.h"
#include "subwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}
mainwidget.h:
#include <QPushButton>
#include "subwidget.h"
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
//切换到子窗口
void open_sub();
//用子窗口含参信号返回的数据做输出
void print_info(int,QString);
private:
QPushButton b1;
QPushButton b2;//两个按钮
SubWidget w; //子窗口
};
#endif // MAINWIDGET_H
subwidget.h:
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
void open_main();//切换到主窗口
signals:
void MySignal();
void MySignal(int,QString);//重载信号
public slots:
private:
QPushButton b1;
QPushButton *b5;//两个按钮
};
#endif // SUBWIDGET_H
mainwidget.cpp:
#include "mainwidget.h"
#include <QDebug> //实现c++中的cout功能,用法为qDebug()<<...
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("MAIN");//窗口标题
b1.setParent(this);
b1.setText("SUB");
b2.setParent(this);
b2.setText("CLOSE");
b2.move(500,500);//两个按钮的父对象、内容、位置
//b1按下,调用自定义槽函数open_sub
connect(&b1,&QPushButton::clicked,this,&MainWidget::open_sub);
//b2按下,调用自带槽函数关闭窗口
connect(&b2,&QPushButton::clicked,this,&MainWidget::close);
//重载的两个信号创建各自的函数指针,信号也是函数
void (SubWidget::*open_main)()=&SubWidget::MySignal;
connect(&w,open_main,this,&MainWidget::show);
void (SubWidget::*send_info)(int,QString)=&SubWidget::MySignal;
connect(&w,send_info,this,&MainWidget::print_info);
//自定义窗口大小,防止再次显示窗口时自动改变大小
resize(600,530);
}
MainWidget::~MainWidget()
{
}
void MainWidget::open_sub()
{
w.show();
this->hide();
}
void MainWidget::print_info(int n,QString str)
{
qDebug()<<n<<str<<endl;
}
subwidget.cpp:
#include "subwidget.h"
#include <QDebug>
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
setWindowTitle("SUB");
b1.setParent(this);
b1.setText("MAIN");
b5=new QPushButton(this);
b5->setText("lambda");
b5->move(100,100);
connect(&b1,&QPushButton::clicked,this,&SubWidget::open_main);
connect(b5,&QPushButton::clicked, //lambda表达式代替后两个参数
[&]() //格式为[捕获变量](参数){函数体}
{ //一定记得在项目文件中加 CONFIG += C++11
qDebug()<<"使用了lambda表达式"; //[=]:外部所有局部变量值传递捕获
b5->setText("ok"); //[&]:父对象成员值传递捕获
} //[value]:变量value值传递捕获
);
resize(300,300);
}
void SubWidget::open_main()
{
this->hide();
MySignal();
MySignal(666,QString("这里是发送的信息"));
}