QT第三天学习

回顾:
布局:
绝对位置法:
手工布局:QLayout
可视化布局:设计器
VB MFC JAVA C# cocos

QT信号和槽

----------------------------------
1.信号与槽 Signals & Slots
信号和槽是一种高级接口(函数),是QT自定义的一种通信机制,独立于标准C++
应用于对象之间的通信,是QT的核心特性,也是QT区别于其它工具包的重要地方。

所有的QObject或其子类(如QWidget)派生的类都包含信号和槽。

Q_OBJECT//这是一个宏 如果需要进行对象之间的通信,必须有这个宏的支持。

信号:当对象改变其状态时,信号就由该对象发射(emit)出去。
当一个信号被发射时,与其有关联的槽将立刻被执行,就像函数调用一样。

槽:槽函数。是普通的C++成员函数,可以被正常调用,和普通成员函数唯一的区别就是可以和信号连接
也有访问权限。

信号和槽关联:
connect(
//信号发出者,信号,信号接收者,槽函数
sender,SIGNAL(signal),receiver,SLOT(slot)
)
connect(button,SIGNAL(clicked()),this,SLOT(close()));

每个QT对象都包含预定的信号和槽。

自定义信号和槽:
自定义的槽:
public slots:
//槽函数声明
自定义信号:
signals:
//信号声明(信号只需要声明,不需要实现)

发射信号:emit 信号;

注:
1.槽不能与槽相联
2.信号与槽的参数要一致(类型,个数,顺序),信号的参数可以比槽的参数多,不能少。
3.信号与槽的参数只需要写类型就可以了,不需要写形参。

案例:初步实现登录功能(即用户名和密码已经确定)

----------------------
2.QString类:
QString类提供了多个函数来操作字符串
编辑操作:
append()/prepend()
replace()
insert()
remove()
isEmpty()

查询操作:
right(),left(),mid(),indexOf()
at(),contains(),count(),startWidth(),endWith()
> < ...
转换操作:
toInt(),toDouble()
number()//静态函数
toLower()/toUpper()
arg()//
QString -> char *
//toUtf8().data()

cal

代码1;

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

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

public slots://自定义槽函数
void mySlots(bool);
void emitSignalSlot();

signals:
void mySignal();

private:
Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//QPushButton *btn = new QPushButton;
ui->pushButton->setText("关闭");
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),
ui->dial,SLOT(setValue(int)));

ui->horizontalSlider->setMaximum(200);
ui->dial->setMaximum(200);

connect(ui->btn,SIGNAL(clicked(bool)),this,SLOT(mySlots(bool)));
// connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(emitSignalSlot()));
// connect(this,SIGNAL(mySignal()),this,SLOT(close()));
}

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

void Widget::mySlots(bool ok)//自定义的槽函数
{

ui->btn->setCheckable(true);//设置按钮可选
bool ok1 = ui->btn->isCheckable();//获取按钮是否可选定
//qDebug() << ok1;
if(ok)
{
ui->btn->setText("打开");
}
else
{
ui->btn->setText("关闭");
}

}

void Widget::emitSignalSlot()//发射信号的槽函数
{
qDebug("emitSignalslot()");
emit mySignal();
}

代码2

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
   // w.show();

    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

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

private:
Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QString str = "hello qt";
str.append("7-20");//追加
str.replace("qt","c++");//替换
str.insert(2,"A");//插入,下标从0开始
//remove
bool ok = str.isEmpty();//判断字符串是否为空

//qDebug() << str;//str = heAllo c++7-20
//------------------------------
//qDebug() << str.right(3);//str的右边3个字符
//qDebug() << str.mid(5,3);//从第5个位置取3个字符
//qDebug() << str.indexOf("++");//获得指定字符串在str中出现的索引位置
//qDebug() << str.at(0);//取第i个位置的值
//qDebug() << str.contains("20");//查询str中是否包含指定的字符串
//qDebug() << str.contains("30");
//qDebug() <<str.count("l");//指定字符串出现的次数
//qDebug() << str.startsWith("h");
//-----------------------------------
QString s = "123.45";
int a;
//a = s.toInt();//把字符串转为整数
double d = s.toDouble();//转为双精度数
qDebug() << s;
qDebug() << d;
QString sd =
QString::number(d);//把数字转为字符串
qDebug() << sd;
//用户名为XXX 密码为XXX
QString name = "zhangfei";
QString pwd = "123";
str = QString("用户名为%1 密码为%2").arg(name).arg(pwd);
qDebug() << str;

char *p = "hello";
QString ss = "world";
// ss.toStdString().data();//把QString转换为char*
// ss.toUtf8().data();
// ss.toLatin1().data();
// ss.toLocal8Bit().data();

}

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

代码三

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

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

private slots:
void on_pushButton_clicked();

private:
Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit_3->setReadOnly(true);//设置文本框为只读
// connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(calcSlot()));
}

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

void Widget::calcSlot()//slot
{
//1.获取两个加数
int n1 = ui->lineEdit->text().toInt();
int n2 = ui->lineEdit_2->text().toInt();
//2.两数相加
int res = n1 + n2;
//3.把结果显示出来
ui->lineEdit_3->setText(QString::number(res));
}

void Widget::on_pushButton_clicked()
{
calcSlot();
}

代码四

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mainform.h"
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

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

private:
Ui::Widget *ui;
mainForm *mf;
};

#endif // WIDGET_H

mainform.h

#ifndef MAINFORM_H
#define MAINFORM_H

#include <QWidget>

namespace Ui {
class mainForm;
}

class mainForm : public QWidget
{
    Q_OBJECT

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

private:
    Ui::mainForm *ui;
};

#endif // MAINFORM_H

mainfrom.cpp

#include "mainform.h"
#include "ui_mainform.h"

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

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

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(loginSlot()));
mf = new mainForm;
}

void Widget::loginSlot()
{
//获取用户输入的用户名和密码
QString name = ui->lineEdit->text();
QString pwd = ui->lineEdit_2->text();
qDebug() << name;
qDebug() << pwd;
//2.判断用户名和密码是否正确
if(name == "zhangfei" && pwd == "123")
{
qDebug() << "登录成功!";

//1.把自己关闭或隐藏
//this->close();
this->hide();
//2.显示主窗体(登录成功后显示的窗体)
mf->show();
}
else
{
qDebug() << "用户名或密码错误";
}
}

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

时间: 2024-07-31 05:38:14

QT第三天学习的相关文章

Qt Installer Framework的学习(三)

Qt Installer Framework的学习(三) Qt Installer Framework的样例中.通常是这种:config目录一般放了一个config.xml文件,包括的是安装配置xml的内容.packages包括的是须要安装的包的内容.普通情况不止一个安装包,每个安装包也不止是一个文件,那么每个包都有目录,里面的目录中有data以及meta子目录. data目录中是安装包的内容,meta目录中是package.xml文件.这个文件包括的是安装包的安装配置内容.另一些项目包括的是p

Qt学习 之 多线程程序设计(QT通过三种形式提供了对线程的支持)

QT通过三种形式提供了对线程的支持.它们分别是, 一.平台无关的线程类 二.线程安全的事件投递 三.跨线程的信号-槽连接. 这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储

Qt下UDP编程学习

一.概述: #include <QUdpSocket> QUdpSocket类继承自QAbstractSocket,该类中的所有函数都是可重入的(reentrent). 二.介绍: QUdpSocket公有类型: enum BindFlag {ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform } flags BindMode QUdpSocket公共函数: QUdpSocket ( QObject * pa

20145207《Java程序设计》第三周学习总结

20145207<Java程序设计>第三周学习总结 教材学习内容总结 这部分可能要扒一些课本而上的东西了.在第三章中,知道了Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.在这一周主要学习了类类型. 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制. 简单来说,类是对象的设计图,对象是类的实例. 要深刻理解对象的含义,例如Clothes c1 = new Clot

Qt Installer Framework的学习(二)

Qt Installer Framework的学习(二) Qt Installer Framework的一些操作可以使用最常见的Qt项目来表示,也就是说,书写pro文件,使用qmake运行之,除了能够编译正常的项目之外,也可以为项目打包.这里最重要的就是binarycreator了.下面就是我命令行使用binarycreator的时候弹出的一些提示,我们可以根据这样的提示,来了解究竟有哪些使用的方法. 上海萌梦信息科技有限公司(微博:http://weibo.com/qtdream)原创文章,首

20145301第三周学习总结

20145301第三周学习总结 教材学习内容总结 第四章 4.1 类与对象 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制 从类看对象:类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象 从对象看类:类的产生,是从少数实例,推广到大量相似实例的抽象化过程(abstraction) 类是对象的设计图,对象是类的实例,生成对象要先定义类 4.2 基本类型包装 Long.In

201671010117 2016-2017-2 《Java程序设计》Java第三周学习心得

Java第三周学习心得 通过这一周的学习,了解到了Java的核心部分,理解了用户自定义类的定义 ,了解了对象的声明 ,了解了使用构造函数初始化对象 ,使用类属性与方法的使用,了解了package和import语句的用途,知道了假设你面对现实世界的一个对象,你不会把它的属性和处理方法分开,程序设计也是一样.面向对象程序设计(OOP):一种新的思维方法,更接近人类处理现实世界问题的自然表示方法.面向对象的语言有:C++,Smalltalk,Java等.面向对象程序设计的几个主要概念:抽象数据类型.类

20145317《信息安全系统设计基础》第三周学习总结

20145317<信息安全系统设计基础>第三周学习总结 教材学习内容总结 整型数据类型 32位机器和64位机器对于同一数据类型的典型取值范围是有所不同的 . 64位机器用8个字节表示:32位机器用4个字节表示 典型取值范围中,取值范围不对称——负数的范围比整数的范围大1 三种最重要的数字表示:①无符号:基于传统的二进制方法,表示大于等于0的数字②补码(有符号数):表示有符号数整数的最常见方法,有符号整数就是可以为正或者负的数字③浮点数:表示实数的科学计数法的以2为基数的版本 ·进制转换:用二进

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS

LINUX内核分析第三周学习总结——构造一个简单的Linux系统MenuOS 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 回顾: [计算机三个法宝] 1)存储程序计算机 2)函数调用堆栈 3)中断 [操作系统两把宝剑] 1)中断上下文的切换:保存现场和恢复现场 2)进程上下文的切换 一.使用gdb跟踪调试内核从start_kernel到init进程启动 使用实验楼的虚拟机打开