栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Qt-01基础-QWidgetg、信号和槽

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Qt-01基础-QWidgetg、信号和槽

这里写自定义目录标题
  • 一、HelloQt(从空向项目开始)
  • 二、信号和槽 (Signal&Slot)
  • 三、两个独立窗口
  • 四、带参数的信号
  • 五、Lamda表达式和信号的功能

一、HelloQt(从空向项目开始)
  1. 创建一个新的项目,选择其他选项,选择创建一个空项目HelloQt
  2. 在HelloQt.pro添加内容,表示使用图形界面(注意后面没有分号)
	Qt += widgets
  1. 编写第一个Widget窗体, 导入qtextcodec.h来解决中文乱码问题
	#include 
	#include 
	
	#include "qtextcodec.h"
	
	
	int main(int argc, char **argv){
	    QApplication app(argc, argv);
	
	    // 解决中文乱码
	    QTextCodec *codec = QTextCodec::codecForName("GBK");
	
	    QWidget widget;
	    widget.setWindowTitle(codec->toUnicode("这是中文标题的写法"));
	    widget.show();
	
	    app.exec();
	    return 0;
	}
  1. 给控件指定父对象的方法
    • setParent()
    • 通过构造函数传参
    //    QPushButton b(&widget);
    QPushButton b;
    b.setParent(&widget);
    b.setText("^_^");
    b.move(100, 100);
    b.show();
    
二、信号和槽 (Signal&Slot)
  1. 简单的点击按钮关闭窗口
    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include 
    #include 
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT	// 使用信号和槽所需要的
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    private:
        Ui::Widget *ui;
        QPushButton b1;		// 定义两个按钮
        QPushButton *b2;	// 定义指针按钮调用的时候需要进行赋值
    };
    
    #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);
    
        b1.setParent(this);
        b1.setText("^-^");
        b1.move(100, 100);
    
        b2 = new QPushButton(this);
        b2->setText("^!^");
        b2->move(200, 200);
    
        
        connect(&b1, &QPushButton::clicked, this, &Widget::close);
    
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
  2. 自定义信号和槽
    自定义槽: 普通函数的用法
    Qt5: 任意的成员函数,普通全局函数,静态函数
    槽函数的 参数和返回值 需要和信号函数的一致
    由于信号没有返回值,所以槽函数也没有返回值

    widget.h中添加void自定义有槽函数

    public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
    void mySlot();
    
    connect(&b1, &QPushButton::clicked, this, &Widget::close);
    
    // b2本来就是一个指针,因此这里不需要添加地址引用符
    connect(b2, &QPushButton::released, this, &Widget::mySlot);
    
    // 按下b2后隐藏b1
    connect(b2, &QPushButton::released, &b1, &QPushButton::hide);
    
    
三、两个独立窗口
  1. 新建.class,会自动生成.h和.cpp两个文件,基类选择QWidget,新建一个Subwidget,主窗口定义一个按钮,点击按钮隐藏主窗口,显示子窗口。在Subwidget中定义一个按钮,点击按钮隐藏子窗口,显示主窗口
    subwidget.h   
    #ifndef SUBWIDGET_H
    #define SUBWIDGET_H
    
    #include 
    #include 
    
    class SubWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit SubWidget(QWidget *parent = nullptr);
        QPushButton b;
    
        void sendSlot();
    
    signals:
        
        void mySingal();
    
    public slots:
    };
    
    #endif // SUBWIDGET_H
    
    =================================================================================
    subWidget.cpp
    
    #include "subwidget.h"
    SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
    {
        this->setWindowTitle("Boos little");
    
        b.setParent(this);
        b.setText("Change to Boss");
    
        connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot);
    }
    
    void SubWidget::sendSlot(){
        emit mySingal();    // 发送信号
    }
    
  2. myWidget主窗口中接收子窗口传递来的信(定义一个connect会一直监听)
    // 处理SubWidget中发送过来的信号
    connect(&sub, &SubWidget::mySingal, this, &Widget::dealSub);
    
    // 处理子窗口信号的函数
    void Widget::dealSub(){
        this->show();
        sub.hide();
    }
    
四、带参数的信号
  1. 在 subwidget.h中定义两个同名不同参数的信号

    subweiget.h
    
    signals:
        
        void mySignal();
        void mySignal(int, QString);
    
    subweiget.cpp
    #include "subwidget.h"
    
    SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
    {
        this->setWindowTitle("Boos little");
    
        b.setParent(this);
        b.setText("Change to Boss");
    
        connect(&b, &QPushButton::clicked, this, &SubWidget::sendSlot);
    }
    
    void SubWidget::sendSlot(){
        emit mySignal();    // 发送信号
    
        // 信号有几个参数,槽函数也得要有对应的参数进行处理
        emit mySignal(250, "我是子窗口");
    }
    
    Weiget.cpp 定义两个处理subWeiget中传输信号的函数, 使用函数指针指定要调用的是有参函数还是无参函数
    
    // 处理SubWidget中发送过来的信号
    void (SubWidget::*NoArgSignal)() = &SubWidget::mySignal;
    connect(&sub, NoArgSignal, this, &Widget::dealSub);
    
    // 处理带有参数的槽函数,这里区分同名带参数的函数和的带参数的函数,现需要使用函数指针
    void (SubWidget::*HaveArgSignal)(int, QString) = &SubWidget::mySignal;
    connect(&sub, HaveArgSignal, this, &Widget::dealSlot);
    
    // 处理子窗口信号的函数
    void Widget::dealSub(){
        this->show();
        sub.hide();
    }
    
    // 处理带有参数的信号
    void Widget::dealSlot(int a, QString str){
        // str.toUtf8() 转换为字节数组 QByteArray
        // .data()      将字节数组QByteArray->char *
    
        qDebug() << a << "==" << str.toUtf8().data();
    }
    
五、Lamda表达式和信号的功能
  1. 在项目文件 .pro中添加新的配置 CONFIG += C++11
    Lambad表达式,匿名函数对象, C++11中新添加的特性, 和Qt信号配合使用

    Lambda表达式 : {主题内容}
    [ 外部变量 ]: 可以将外部变量传入

  2.     connect(b4, &QPushButton::released, [=]() mutable
            {
                qDebug() << "111111";
                b4->setText("123");
            }
        );
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012422.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号