QT 自定义组件 界面跳转

一、引用组件需要的类(头文件)

1、按钮类

QPushButton: 普通按钮;

QToolButton: 工具按钮;

QRadioButton: 单选按钮;

QCheckBox: 复选按钮;

QCommandLinkButton: 命令连接按钮;

2、布局类

QHBoxLayout水平

QVBoxLayout垂直

QGridLayout网格

QFormLayout表单

QSrackedLayout.堆栈

3、输出类

QLabel: 标签;

ob->setAlignment(QT::AlignCenter); //文本居中对齐

obj->setPixmap(QPixmap("文件名")); //设置标签图片

obj->setScaledContents(true); //自动缩放显示图片

QMovie *ob = new QMovie("文件名");

obj->setMove(ob); //设置标签动画

ob->start(); //开始播放

QTextBrowser: 文本浏览器;

QCalendarWidget: 日历窗口;

QLCDNumber: 七段数码管;

lcd->setDigitCount(n); //设置显示位数

lcd->display(n); //显示数字n

ProgressBar: 进度条;

pb->setValue(n); //显示进度n

QTimer *t = new QTimer;

connect(t, SIGNAL(timeout()), this, SLOT(updata_value()));

t->start(n);//每过n毫秒修改updata_value中的对象值

4、输入类

QComboBox: 组合框;

cmb->addItem("text"); //添加下拉选项

QFontComBox: 字体下拉框;

QTextEdit: 文本编辑框;

QLineEdit: 行编辑框;

setPlaceholderText("text"); //编辑框内的提示信息

QSpinBox: 自旋框;

QTimeEdit: 调整时间;

QDial: 旋钮;

QScrollBar: 滚动条;

setOrientation(Qt::Horizontal); //水平显示,默认垂直

QSlider: 滑动杆;

setRange(x, y); //设置范围

setMaximum(m); //设置最大值

setSingleStep(m); //设置单步步长

5、容器

QGroupBox: 分组框;

g->setLayout(vbox); //将布局好的ui加入groupbox中

vbox->setwidget(g); //最终的布局使用setWidget装入groupbox窗口

QWidget: 分组(无边框);

QScrollArea: 滚动窗口容器;

setWidget(lb); //将lb放入容器

QToolBox: 工具栏;

QTabWidget: 制表容器;

setTabsClosable(true);//设置标签可关闭

QStackedWidget: 栈容器;

二、使用组件对应的类 实例化对象(头文件)

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

//引用需要的类
#include <QWidget>
#include <QWidget>
#include <QDebug>
#include <QIcon>//图标类
#include <QPushButton>//按钮类
#include <QLabel>//标签类
#include <QMovie>//动画类
#include <QLineEdit>//行编辑器
#include <QMessageBox>//对话框

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

    //声明对象(组件)
    //按键
    QPushButton *btn1;
    QPushButton *btn2;

    //标签
    QLabel *lab1;
    QLabel *lab2;
    QLabel *lab3;//抬头

    //行编辑器
    QLineEdit *edit1;
    QLineEdit *edit2;



};
#endif // WIDGET_H

三、设置组件属性(原文件)

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);//将自己的类绑定到Ui

    //1、设置窗口
    this->setFixedSize(499,375);//固定尺寸
    this->setWindowTitle("登录");//设置抬头名称
    this->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));//设置窗口图标
                                //图片路径
    //2、为对象(组件)申请空间
    //按键
    btn1 = new QPushButton("登录",this);
    btn2 = new QPushButton("取消",this);

    //标签
    lab1 = new QLabel("账号",this);
    lab2 = new QLabel("密码",this);
    lab3 = new QLabel(this);//抬头

    //行编辑器
    edit1 = new QLineEdit(this);
    edit2= new QLineEdit(this);

    //3、对象属性编辑
    //尺寸
    btn1->resize(80,40);
    btn2->resize(80,40);

    edit1->resize(265,20);
    edit2->resize(265,20);

    lab1->resize(50,20);
    lab2->resize(50,20);
    lab3->resize(534,375/2);

    qDebug()<<lab1->width()<<lab1->height();

    //坐标
    btn1->move(113,285);
    btn2->move(534-133-100,btn1->y());

    lab1->move(btn1->x()-btn1->width()+32,btn1->y()-60);
    lab2->move(btn1->x()-btn1->width()+32,btn1->y()-30);

    edit1->move(lab1->x()+lab1->width(),lab1->y());
    edit2->move(lab2->x()+lab2->width(),lab2->y());

    //样式
    QMovie *lab3_movie = new QMovie(":/tabel/misak.gif");
    lab3_movie->start();
    lab3->setMovie(lab3_movie);//邦定
    //lab3->setScaledContents(true);//自适应尺寸

    //功能属性
    edit2->setEchoMode(QLineEdit::Password);
    edit2->setPlaceholderText("密码");

    //4、绑定信号与槽
    connect(btn1,&QPushButton::clicked,this,&Widget::Widget_btn1_slot);
    connect(btn2,&QPushButton::clicked,this,&Widget::Widget_btn2_slot);
    //在哪都可以,只要在使用前绑定就可以了
    //由于只需要绑定一次,为了方便和避免重复调用,会放在构造函数中
    //如果需要重复的解除绑定、重新绑定,则根据具体逻辑选择位置
}

//槽函数定义
void Widget::Widget_btn1_slot()
{
    QLabel *lab4 = new QLabel;
    QLabel *lab5 = new QLabel;
    if(edit1->text() == 0)
    {
        //QLabel *lab4 = new QLabel;
        lab4->setWindowTitle("账号为空");
        lab4->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));
        QMovie *lab4_movie = new QMovie(":/tabel/spase.webp");
                                            //动图路径
        lab4_movie->start();
        lab4->setMovie(lab4_movie);//绑定
        lab4->setScaledContents(true);//自适应尺寸
        lab4->show();
    }
    else if(edit1->text() == edit2->text())
    {
       qDebug()<<"login_success";

       emit jump_signals();//信号会发送给所有对象,但只有和该信号绑定的对象才会响应

       this->close();
    }else
    {
        qDebug()<<"false";
        //QLabel *lab5 = new QLabel;
        lab5->setWindowTitle("账号密码不正确");
        lab5->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));
        QMovie *lab5_movie = new QMovie(":/tabel/error.webp");
        lab5_movie->start();
        lab5->setMovie(lab5_movie);//绑定
        lab5->setScaledContents(true);//自适应尺寸
        lab5->show();
        edit2->clear();
    }
}

void Widget::Widget_btn2_slot()
{
    QMessageBox box(QMessageBox::Information,
                    "退出",
                    "确定退出吗?",
                    QMessageBox::Ok | QMessageBox::No,
                    this);

    box.setButtonText(QMessageBox::Ok,"确定");
    box.setButtonText(QMessageBox::No,"取消");

    int res = box.exec();

    if(res == QMessageBox::Ok)
    {
        close();
    }
}

四、信号与槽 的设置(界面跳转开始设置)

1、头文件中声明 信号与槽

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

//引用需要的类
#include <QWidget>
#include <QWidget>
#include <QDebug>
#include <QIcon>//图标类
#include <QPushButton>//按钮类
#include <QLabel>//标签类
#include <QMovie>//动画类
#include <QLineEdit>//行编辑器
#include <QMessageBox>//对话框

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

    //声明对象(组件)
    //按键
    QPushButton *btn1;
    QPushButton *btn2;

    //标签
    QLabel *lab1;
    QLabel *lab2;
    QLabel *lab3;//抬头

    //行编辑器
    QLineEdit *edit1;
    QLineEdit *edit2;


public slots:
    void Widget_btn1_slot();//槽函数声明
    void Widget_btn2_slot();

signals:
    void jump_signals();//跳转信号声明
};
#endif // WIDGET_H

2、原文件中定义 槽函数

cpp 复制代码
//槽函数定义
void Widget::Widget_btn1_slot()
{
    QLabel *lab4 = new QLabel;
    QLabel *lab5 = new QLabel;
    if(edit1->text() == 0)
    {
        //QLabel *lab4 = new QLabel;
        lab4->setWindowTitle("账号为空");
        lab4->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));
        QMovie *lab4_movie = new QMovie(":/tabel/spase.webp");
        lab4_movie->start();
        lab4->setMovie(lab4_movie);//绑定
        lab4->setScaledContents(true);//自适应尺寸
        lab4->show();
    }
    else if(edit1->text() == edit2->text())       //发送事件
    {
       qDebug()<<"login_success";

       //发送跳转信号
       emit jump_signals();//信号会发送给所有对象,但只有和该信号绑定的对象才会响应

       this->close();
    }else
    {
        qDebug()<<"false";
        //QLabel *lab5 = new QLabel;
        lab5->setWindowTitle("账号密码不正确");
        lab5->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));
        QMovie *lab5_movie = new QMovie(":/tabel/error.webp");
        lab5_movie->start();
        lab5->setMovie(lab5_movie);//绑定
        lab5->setScaledContents(true);//自适应尺寸
        lab5->show();
        edit2->clear();
    }
}

void Widget::Widget_btn2_slot()
{
    QMessageBox box(QMessageBox::Information,
                    "退出",
                    "确定退出吗?",
                    QMessageBox::Ok | QMessageBox::No,
                    this);

    box.setButtonText(QMessageBox::Ok,"确定");
    box.setButtonText(QMessageBox::No,"取消");

    int res = box.exec();

    if(res == QMessageBox::Ok)
    {
        close();
    }
}

3、绑定对应的信号与槽

    //4、绑定信号与槽
    connect(btn1,&QPushButton::clicked,this,&Widget::Widget_btn1_slot);
    connect(btn2,&QPushButton::clicked,this,&Widget::Widget_btn2_slot);
    //在哪都可以,只要在使用前绑定就可以了
    //由于只需要绑定一次,为了方便和避免重复调用,会放在构造函数中
    //如果需要重复的解除绑定、重新绑定,则根据具体逻辑选择位置

五、跳转目标界面设置

1、头文件

cpp 复制代码
#ifndef LOG_SUCCESS_H
#define LOG_SUCCESS_H

#include <QWidget>
#include <QLabel>//标签类
#include <QMovie>//动画类
#include <QIcon>//图标类

namespace Ui {
class log_success;
}

class log_success : public QWidget
{
    Q_OBJECT

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

private:
    Ui::log_success *ui;

    QLabel *lab4;

    QMovie *lab4_movie;

public slots:
    void jump_slot();

};

#endif // LOG_SUCCESS_H

2、原文件

cpp 复制代码
#include "log_success.h"
#include "ui_log_success.h"

log_success::log_success(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::log_success)
{
    ui->setupUi(this);
    //界面写在构造函数内的话 启动就会调用

//    未将组件绑定到ui 需要单独调用
    lab4 = new QLabel;
//    lab4 = new QLabel(this);//绑定到ui
    lab4->setWindowTitle("登录成功");
    lab4->setWindowIcon(QIcon(":/tabel/kamijo_.webp"));

    lab4_movie = new QMovie(":/tabel/misak_mikoto.gif");
    lab4_movie->start();
    lab4->setMovie(lab4_movie);//绑定
    lab4->setScaledContents(true);//自适应尺寸

}

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

//跳转响应槽函数
void log_success::jump_slot()
{
    //单独调用
    log_success::lab4->show();

    //调用整个ui -> form
    //show();
}

六、绑定跳转信号和跳转响应槽函数(主函数)

cpp 复制代码
#include "widget.h"
#include "log_success.h"

#include <QApplication>

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

    log_success l;

    QObject::connect(&w, &Widget::jump_signals, &l, &log_success::jump_slot);

    return a.exec();
}
相关推荐
Narutolxy4 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader11 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
Mr.1322 分钟前
数据库的三范式是什么?
数据库
禁默22 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood29 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑31 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶35 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Python之栈36 分钟前
【无标题】
数据库·python·mysql
qq_4336184437 分钟前
shell 编程(二)
开发语言·bash·shell
风_流沙1 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch