Qt-C++基础界面开发(3- 简单Input Widget控件和Containers等多窗口 *** 作)

Qt-C++基础界面开发(3- 简单Input Widget控件和Containers等多窗口 *** 作),第1张

Qt-C++基础界面开发
  • 1 Input Widget的简单使用
    • 1.1 Combo Box控件的基本 *** 作
    • 1.2 Line Edit控件的基本 *** 作
    • 1.3 Text Edit控件的基本 *** 作
  • 2 Containers等控件和多窗口 *** 作
    • 2.1 页面跳转(推荐)
      • 2.1.1 页面A和页面B的设计
      • 2.1.2 添加头文件
      • 2.1.3 在源文件实现打开页面 *** 作
    • 2.2 页面跳转(隐藏主界面模式)
      • 2.2.1 界面设计
      • 2.2.2 页面A触发跳转 *** 作并隐藏(非最终跳转代码)
      • 2.2.3 页面B触发跳转实现页面AB之间的切换(最终跳转代码)
    • 2.3 页面跳转传递参数
      • 2.3.1 实现页面跳转(隐藏主界面)
      • 2.3.2 设计传参控件(可以不需要)
      • 2.3.3 在页面B中设计传参函数
      • 2.3.4 在页面A中调用传参函数
    • 2.4 在页面A上显示页面B之Scroll Area容器
    • 2.5 0积分窗口代码下载

1 Input Widget的简单使用 1.1 Combo Box控件的基本 *** 作

1、在界面的UI设计combo box变量
2、在cpp文件中利用lambda表达式实现其功能 *** 作
3、Combo box包括下拉改变状态、获取当前状态、设置当前状态为未选择等基础 *** 作

1、在界面的UI中设计combo box的变量名为cbx,并且添加一个label用于显示状态变化的文字

2、在界面的cpp文件中,对界面进行实现mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、设计下拉按钮标签文字
    for(int i = 0 ; i < 10;++i){
        QString str = "第" + QString::number(i) + "个";
        ui->cbx->addItem(str);
    }
    // 2、默认未勾选任何批次,将当前index设置为-1即可
    ui->cbx->setCurrentIndex(-1);

    // 3、设计下拉按键实现不同功能(主要在于触发事件为currentTextChanged)
    connect(ui->cbx,&QComboBox::currentTextChanged,this,[=](){
        // 3.1、当前下拉按钮的位置
        int index = ui->cbx->currentIndex();
        //  更改label的内容
        ui->label->setText("我是" +QString::number(index)+"个按钮");
    });
}

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

3、实现效果:

1.2 Line Edit控件的基本 *** 作

1、在界面的UI设计Line Edit变量
2、在cpp文件中利用lambda表达式实现其功能 *** 作
3、Line Edit包括当前内容变化等触发事件和获取当前内容的 *** 作等

1、 在UI中设计Line Edit 并命名

2、 在cpp中实现对line edit的内容读取(触发事件是实时读取的)mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加
    // 1、line edit的内容变化,触发label显示该内容
    connect(ui->let,&QLineEdit::textChanged,this,[=]{
        // 2、 此时的label显示内容是实时的
        // line edit一般用来作为输入窗口配合按钮使用,来获取输入内容
        ui->label->setText(ui->let->text());
    });
}

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

3、效果如下所示:

1.3 Text Edit控件的基本 *** 作

1、在界面的UI设计Text Edit变量
2、在cpp文件中利用lambda表达式实现其功能 *** 作
3、Text Edit包括当前内容变化等触发事件和获取当前内容的 *** 作等
4、Text Edit 和 Line Edit的区别在于Text Edit可以输入多行,且得到的文本还是作为一个字符串,且Text Edit获取文本的函数为toPlainText()

1、 在UI中设计Line Edit 并命名

2、 在cpp中实现对line edit的内容读取(触发事件是实时读取的)mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、类似于line edit利用文件变化触发,获取text edit的内容
    connect(ui->ted,&QTextEdit::textChanged,this,[=]{
        // 2、 text edit和line edit区别在于text edit输入可以是多行文本
        ui->label->setText(ui->ted->toPlainText());
    });
}

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

3、效果如下所示:

2 Containers等控件和多窗口 *** 作 2.1 页面跳转(推荐)

1、该模式比隐藏主界面模式简单
2、控件点击后,直接打开界面B,然后关闭界面A(主界面)

2.1.1 页面A和页面B的设计

1、其中只包括label显示其为页面1,和按钮push button且命名为pbt实现页面跳转的功能

2、添加页面B进入到工程

  • 1、右键工程,如test添加新文件,如下图所示,选择Qt中的Qt 设计师界面类
  • 2、根据需求,选择Main Window或者 Widget即可
  • 3、设计类名,并且是要添加到工程文件夹下面

  • 4、设计页面B,包含一个label显示这个是页面B和一个按钮返回页面A
2.1.2 添加头文件
  • 1、在页面A的头文件中添加页面B,即只要包含一句#include "formb.h"即可,页面A的文件mainwindow.h如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include "formb.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

  • 2、在页面B的头文件中添加页面A,即只要包含一句#include "mainwindow.h"即可,页面B的formb.h如下所示:
#ifndef FORMB_H
#define FORMB_H

#include 
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

2.1.3 在源文件实现打开页面 *** 作
  • 1、对于页面A,此时对按键进行功能实现:点击后打开页面B,并关闭页面A,mainwindow.cpp如下所示:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    // 点击按钮打开页面B,关闭页面A
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 新建页面B的对象,并打开
        FormB* nf = new FormB();
        nf->show();
        // 页面A关闭
        this->close();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
  • 2、此时即已经实现点击按钮跳转页面就打开了页面B
  • 3、同样的,对页面B进行点击按钮实现打开页面A,关闭页面B,此时formb.cpp如下所示
#include "formb.h"
#include "ui_formb.h"

FormB::FormB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormB)
{
    ui->setupUi(this);
    // 点击按钮打开页面B,关闭页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        MainWindow* nf = new MainWindow();
        nf->show();
        this->close();
    });
}

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

  • 4、至此完成界面的跳转

总结:
1、以上四个文件即包括了所有代码
2、打开页面B的对象,关闭页面A,即实现页面的切换

2.2 页面跳转(隐藏主界面模式)

1、设计触发跳转页面的控件,例如按钮等
2、控件触发后,打开新页面,自身可以隐藏也可以不隐藏
3、新界面触发事件,发出信号给旧界面实现页面切换

1、页面A的按钮点击,发送出跳转信号,被页面B接收
2、在页面A头文件中添加页面B
3、在按钮的Lambda或者槽函数中实现页面跳转

2.2.1 界面设计

见前面2.1.1

2.2.2 页面A触发跳转 *** 作并隐藏(非最终跳转代码)

1、在页面A的头文件中添加页面B,即只要包含一句#include "formb.h"即可

2、在.cpp文件实现页面跳转mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();

    });
}

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

此时实现的效果页面A能打开页面B,但是页面B打开不了页面A!!

2.2.3 页面B触发跳转实现页面AB之间的切换(最终跳转代码)

1、在页面 B的头文件 中添加页面A和信号,返回界面A, 注意信号声明在public 下!!

signals:
    //  返回页面A
    void backA();

整个代码如下所示:formb.h

#ifndef FORMB_H
#define FORMB_H

#include 
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

signals:
    //  返回页面A
    void backA();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

2、页面B在cpp文件实现向页面A跳转 *** 作formb.cpp

#include "formb.h"
#include "ui_formb.h"

FormB::FormB(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormB)
{
    ui->setupUi(this);
    
    // 1、 按键触发页面B隐藏并发信号,打开页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        // 发出信号
        emit backA();
        // 页面B隐藏
        this->hide();
    });
}

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

此时针对页面A的cpp文件mainwindow.cpp,添加触发事件:值得注意的有:

1、页面B返回页面A的信号是在页面A跳转到页面B的事件中实现的
2、在跳转回页面A时候,页面B被当做一个控件

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();
        // 3 页面B触发事件打开页面A
        connect(nf,&FormB::backA,this,[=]{
            // 打开页面A
            this->show();
        });

    });
}

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

2.3 页面跳转传递参数 2.3.1 实现页面跳转(隐藏主界面)

此时见 2.2 节实现即可

2.3.2 设计传参控件(可以不需要)

此时,在页面A中添加一个拖动条(Horizontal Silder),且命名为hs

此时,在页面B中添加一个label命名为lab_hs来显示页面A的托拉条数据

2.3.3 在页面B中设计传参函数

1、由A打开B,B获得A的参数
2、因此在A打开B的时候,B调用其中某个函数获取A的参数


此时页面B的头文件中设计传参函数getHsData,注意其添加在页面B的slot函数内,且为public,此时formb.h如下

#ifndef FORMB_H
#define FORMB_H

#include 
#include "mainwindow.h"

namespace Ui {
class FormB;
}

class FormB : public QWidget
{
    Q_OBJECT

public:
    explicit FormB(QWidget *parent = nullptr);
    ~FormB();

public slots:
    void getHsData(int);

signals:
    //  返回页面A
    void backA();

private:
    Ui::FormB *ui;
};

#endif // FORMB_H

此时在页面B的cpp文件对该槽函数进行实现,即在lab_hs下显示内容:
此时的formb.cpp有:

#include "formb.h"
#include "ui_formb.h"

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

    // 1、 按键触发页面B隐藏并发信号,打开页面A
    connect(ui->pbt_b,&QPushButton::clicked,this,[=]{
        // 发出信号
        emit backA();
        // 页面B隐藏
        this->hide();
    });
}

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

// 对获得到的数据进行显示
void FormB::getHsData(int a){
    ui->lab_hs->setText(QString::number(a));
}

2.3.4 在页面A中调用传参函数

由于传参函数是在页面B中的,因此也在打开页面B的时候调用传参函数

此时的页面A的cpp文件mainwindow.cpp如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、页面A的按钮触发
    connect(ui->pbt_a,&QPushButton::clicked,this,[=]{
        // 2.1 、新建页面B并显示,至此打开新界面
        FormB* nf = new FormB();
        nf->show();
        // 2.2 、主界面A隐藏
        this->hide();
        // 传递参数
        nf->getHsData(ui->hs->value());

        // 3 页面B触发事件打开页面A
        connect(nf,&FormB::backA,this,[=]{
            // 打开页面A
            this->show();
        });

    });
}

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

此时实现的效果如下所示:

2.4 在页面A上显示页面B之Scroll Area容器

1、在页面A上设计scroll area容器
2、设计好页面B
3、在页面A的cpp文件实现scroll area显示页面B

1、在页面A界面上设计scroll area重命名为sa


2、类似2.1.1 *** 作创建页面B

3、在页面A上显示页面Bmainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、新建页面B
    FormB* nf = new FormB();
    // 2、显示页面B
    ui->sa->setWidget(nf);
}

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

3、最终实现效果

同样的,在页面A上添加一个line edit命名为ldt,此时可以在 页面A中对页面B进行 *** 作mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 代码在此后面添加

    // 1、新建页面B
    FormB* nf = new FormB();
    // 2、显示页面B
    connect(ui->ldt,&QLineEdit::textChanged,this,[=]{

        nf->getHsData(ui->ldt->text().toInt());
    });

    ui->sa->setWidget(nf);
}

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

有实现效果:

2.5 0积分窗口代码下载

窗口代码下载

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/873128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存