Qt笔记第一天
首先,进行Qt的安装与配置,参考网上的教程完成即可。
解释:.pro文件
QT += core gui //模块的名字
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test //应用程序名
TEMPLATE = app //生成的makefile的模板类型
//源文件
SOURCES += main.cpp\
mainwindow.cpp
//头文件
HEADERS += mainwindow.h
//窗口设计文件
FORMS += mainwindow.ui
.pro是工程文件 是qmake自动生成的用于生产makefile的配置文件
'#'是注释的意思
最简单的一个Qt小窗口是:
#include <QApplication>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w;
w.show();
return a.exec();
}
a.exec( ) 进入消息循环,短暂暂停,显示给用户或等待用户操作。
信号与槽
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton button("Quit");
QObject::connect(&button, &QPushButton::clicked,
&app, &QApplication::quit);
button.show();
return app.exec();
}
connect的基本写法是
connect(sender, signal, receiver, slot);
可以通过自定义信号或自定义槽函数的方法,进行操作。
其中如果是在UI界面中画出来的按钮,如果slot函数的名称为on_pushButton_1_clicked()
则可以省去connect函数
学习代码如下
signalslotswidget.h
文件:
#ifndef SIGNALSLOTSWIDGET_H
#define SIGNALSLOTSWIDGET_H
#include <QWidget>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class signalslotsWidget; }
QT_END_NAMESPACE
class signalslotsWidget : public QWidget
{
Q_OBJECT
public:
signalslotsWidget(QWidget *parent = nullptr);
~signalslotsWidget();
QPushButton b1;
int num = 999;
public slots:
void on_b1_clicked();
void on_pushButtonADD_clicked();
void on_pushButtonSUB_clicked();
private:
Ui::signalslotsWidget *ui;
};
#endif // SIGNALSLOTSWIDGET_H
signalslotswidget.cpp
文件:
#include "signalslotswidget.h"
#include "ui_signalslotswidget.h"
#include <QPushButton>
#include <QLCDNumber>
signalslotsWidget::signalslotsWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::signalslotsWidget)
{
ui->setupUi(this);
// 使用指针 创建按钮 点击按钮 发出信号 调用函数 关闭窗口
// 使用qt5写法数学connect函数 调用系统方法
QPushButton *b0 = new QPushButton(this);
b0->setText("click to close");
b0->resize(150, 30);
b0->move(150, 150);
// 写出连接函数 将按钮产生的clicked信号与窗体关闭的系统槽函数 close()相连接
// 当点击按钮时 自动调用关闭整个窗口
// connect四个参数 sender发送者指针 signal信号指针 receiver接收者指针 slot槽函数
connect(b0, &QPushButton::clicked, this, &signalslotsWidget::close);
// 上述事例用的是系统信号和系统槽函数
// 使用自定义槽函数
// 需要在.h中声明 槽函数(slots) 在.cpp中实现槽函数
b1.setParent(this);// 没有设置父对象 无法显示
b1.resize(120,30);
b1.move(50, 150);
b1.setText(":)");
// 连接b1信号和slots
connect(&b1, &QPushButton::clicked, this, &signalslotsWidget::on_b1_clicked);
ui->lcdNumber->display(num);
connect(ui->pushButtonAdd, &QPushButton::clicked, this, &signalslotsWidget::on_pushButtonADD_clicked);
connect(ui->pushButtonSub, &QPushButton::clicked, this, &signalslotsWidget::on_pushButtonSUB_clicked);
// 自定义信号 自定义带参数信号
}
signalslotsWidget::~signalslotsWidget()
{
delete ui;
}
void signalslotsWidget::on_b1_clicked() // 类的外联函数实现方法
{
b1.setText("^_^");
}
void signalslotsWidget::on_pushButtonADD_clicked()
{
ui->lcdNumber->display(++num);
}
void signalslotsWidget::on_pushButtonSUB_clicked()
{
ui->lcdNumber->display(--num);
}
//void signalslotsWidget::on_pushButtonAdd_clicked()
//{
// // 不能直接++num ++的话num会变 但是display的值还是原始的值
// // ui控件设计的时候 如果在头文件中 槽函数命名与控件名一致 会生成默认槽函数 自动连接 不必写connect
// // ui->lcdNumber->display(++num);
//}
//void signalslotsWidget::on_pushButtonSub_clicked()
//{
// // ui->lcdNumber->display(--num);
//}
打开多个窗口:
subwidget.h
文件
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QString>
class subWidget : public QWidget
{
Q_OBJECT
public:
explicit subWidget(QWidget *parent = nullptr);
QPushButton *b3;
signals:
/*
signals关键字,用于自定义信号
信号没有返回值,但是可以带参数,参数可以不只一个
信号其实就是一个函数声明,不用实现,只用声明
使用emit关键字,进行信号的发送
信号可以重载(同一函数名,多种不同参数表)
*/
void signalToMain();
void signalToMainWithArg(int, QString);
public slots:
void on_b3_clicked();
};
#endif // SUBWIDGET_H
subwidget.cpp
文件:
#include "subwidget.h"
subWidget::subWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("subWin");
this->resize(800,600);
b3 = new QPushButton(this);
b3->setParent(this);
b3->setText("changetoMainWin");
connect(b3,&QPushButton::clicked,this,&subWidget::on_b3_clicked);
}
void subWidget::on_b3_clicked()
{
//通过按钮信号调用槽函数,向主窗口发送信号
emit signalToMain();
//信号可以带参数
emit signalToMainWithArg(250,"我是子窗口发来的带参信号");
}
main.cpp
:
#include "changwidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
changWidget w;
w.show();
return a.exec();
}
changewidget.h
#ifndef CHANGWIDGET_H
#define CHANGWIDGET_H
#include <QWidget>
#include "subwidget.h"
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class changWidget; }
QT_END_NAMESPACE
class changWidget : public QWidget
{
Q_OBJECT
public:
changWidget(QWidget *parent = nullptr);
~changWidget();
QPushButton *b1;
QPushButton *b2;
public slots:
void on_buttonchange_clicked();
void on_subWin_received();
void on_subWin_receivedWithArg(int, QString);
private:
Ui::changWidget *ui;
subWidget subwin;
};
#endif // CHANGWIDGET_H
changewidget.cpp
:
#include "changwidget.h"
#include "ui_changwidget.h"
#include <QDebug>
changWidget::changWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::changWidget)
{
ui->setupUi(this);
this->setWindowTitle("mainWin");
b1 = new QPushButton(this);
b2 = new QPushButton(this);
b1->setText("close");
b2->setText("changetoSubWin");
b1->move(200,50);
b2->move(100,50);
connect(b1,&QPushButton::clicked,this,&changWidget::close);
connect(b2,&QPushButton::clicked,this,&changWidget::on_buttonchange_clicked);
//subwin.show();
connect(&subwin,&subWidget::signalToMain,
this,&changWidget::on_subWin_received);
connect(&subwin,&subWidget::signalToMainWithArg,
this,&changWidget::on_subWin_receivedWithArg);
}
changWidget::~changWidget()
{
delete ui;
}
void changWidget::on_buttonchange_clicked()
{
//显示子窗口然后隐藏主窗口
subwin.show();
this->hide();
}
void changWidget::on_subWin_received()
{
//隐藏子窗口,显示主窗口
subwin.hide();
this->show();
}
void changWidget::on_subWin_receivedWithArg(int a, QString str)
{
qDebug() << a << str;
}