首页 > 其他分享 >QT MVC开发模式

QT MVC开发模式

时间:2023-04-17 22:55:49浏览次数:36  
标签:const QT LoginController 模式 MVC QString QWidget LoginWidget password

一、简单介绍

今天我来记录一下在Qt中使用MVC模式进行开发的过程。MVC(Model-View-Controller)是一种常见的软件架构模式,用于将应用程序的逻辑和用户界面分离开来。在Qt中,使用MVC模式可以大大提高应用程序的可维护性和可扩展性。通过将应用程序的逻辑和用户界面分离开来,可以更轻松地进行修改和调试,并且可以轻松地添加新的功能和视图。那么,如何在Qt中实现MVC模式呢?下面让我们一步一步来做一个简单的示例。

二、案例

1.Model 层

Model层负责提供数据,并把数据封装成数据对象,这里我们用一个User类来代表用户信息。User类包含两个属性:用户名(username)和密码(password)

class User
{
public:
    void setUsername(const QString& username);
    QString getUsername() const;

    void setPassword(const QString& password);
    QString getPassword() const;

private:
    QString m_username;
    QString m_password;
};

2.View 层

View层负责处理与用户的交互,接收用户输入、显示结果等。在这个登录案例中,我们需要设计一个LoginWidget来实现用户登录的视图。  
class LoginWidget : public QWidget
{
    Q_OBJECT

public:
    LoginWidget(QWidget* parent = nullptr);

signals:
    void signalLogin(const QString& username, const QString& password);

private slots:
    void slotLogin();

private:
    QLineEdit* m_usernameLineEdit;
    QLineEdit* m_passwordLineEdit;
};

3.Controller

Controller层作为桥梁连接Model和View,处理用户请求并响应相应的操作。在这个登录案例中,我们需要一个LoginController类来处理用户的登录请求,验证用户名和密码是否正确,并将结果传回给View层。

class LoginController : public QObject
{
    Q_OBJECT

public:
    LoginController(QObject* parent = nullptr);

public slots:
    void slotLogin(const QString& username, const QString& password);

signals:
    void signalLoginResult(bool result);

private:
    bool checkUser(const QString& username, const QString& password); // 模拟验证用户信息是否正确的函数
};

4.建立连接

在MVC架构中,View层和Controller层应该是解耦的,需要通过信号槽机制进行连接。我们在主函数中创建一个User实例和一个LoginController实例,并将它们连接起来,并将LoginWidget添加到QWidget控件中进行显示。具体代码如下:

int main(int argc, char** argv)
{
    QApplication app(argc, argv);

    QWidget* widget = new QWidget;
    QVBoxLayout* layout = new QVBoxLayout;

    LoginWidget* loginWidget = new LoginWidget;
    layout->addWidget(loginWidget);
    widget->setLayout(layout);

    User user;
    LoginController controller;
    QObject::connect(loginWidget, &LoginWidget::signalLogin, &controller, &LoginController::slotLogin);
    QObject::connect(&controller, &LoginController::signalLoginResult, [widget](bool result) {
        if (result) {
            QMessageBox::information(widget, "Login Success", "Login success.");
        } else {
            QMessageBox::warning(widget, "Login Failed", "Username or password is wrong.");
        }
    });
    widget->show();
    return app.exec();
}

在上面的代码中,我们创建了一个QWidget控件,并设置一个QVBoxLayout布局管理器。然后创建了一个LoginWidget视图,并将其添加到QWidget控件中进行显示。接着创建了一个User实例和一个LoginController实例,并将LoginWidget的signalLogin信号连接到LoginController的slotLogin槽函数上,以处理用户登录请求。最后,将LoginController的signalLoginResult信号连接到一个lambda槽函数上,根据验证结果弹出对话框提示用户。

 

标签:const,QT,LoginController,模式,MVC,QString,QWidget,LoginWidget,password
From: https://www.cnblogs.com/just-like/p/17327846.html

相关文章

  • 理解Android系统的进程间通信原理(一)----RPC中的代理模式
    理解Android系统的进程间通信原理(一)----RPC中的代理模式Android系统中的进程间通信是通过一个轻量级的RPC(RemoteProcedureCall远程进程调用)和AIDL(AndroidInterfaceDefininationLanguage)规范来生成两个进程之间可以相互访问的代码。其中RPC是以接口方式来实现,客户端与被......
  • 虚拟机的三种网络模式分别是什么含义?
    桥接模式:其实就是你的虚拟机当做局域网中的一员,跟你的主机是平起平坐的。虚拟机的网段和主机的网段是一样的。比如主机是192.168.1.101,虚拟机也是192.168.1.102.....弊端:假如你现在从学院回家了,主机的IP会发生变化,而你的虚拟机由于都是设置的静态,所以不发生变化,此时主机......
  • ASP.NET Core MVC 从入门到精通之布局
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NETCor......
  • 04工厂模式
    制造对象,不仅只有使用new操作符。实例化不应该总是公开进行,因为经常会导致耦合问题。01例子假设你有一个披萨店,身为披萨店的主人,代码可能是这样:PizzaorderPizza(){//为了让系统有弹性,我们很希望这是一个抽象类或接口。但如果这样,这些类或接口就无法直接实例化。Pizz......
  • 【Spring MVC + Tomcat】Spring MVC 传统VS现代方式的启动过程对比
    1 前言这节我们来讨论下SpringMVC传统和现在的启动方式的不同,可能大家现在上手就是SpringBoot直接给我们内置Tomcat,我们最多也就是改改配置就完事了,我记得我上学的时候写SSM的时候,还要整理各种Jar包和配置,这节我们就来对比下两种启动方式是如何启动SpringMVC的哈。2  传......
  • Qt音视频开发38-ffmpeg视频暂停录制的设计
    一、前言基本上各种播放器提供的录制视频接口,都是只有开始录制和结束录制两个,当然一般用的最多的也是这两个接口,但是实际使用过程中,还有一种可能需要中途暂停录制,暂停以后再次继续录制,将中间部分视频不需要录制,跳过这部分不需要的视频,而且录制的视频文件必须是能够正常播放的连续......
  • js判断是否手机模式
    functionautoLoad(){varsUserAgent=navigator.userAgent.toLowerCase();varbIsIpad=sUserAgent.match(/ipad/i)=="ipad";varbIsIphoneOs=sUserAgent.match(/iphoneos/i)=="iphoneos"......
  • vmware桥接模式设置固定ip
    1.ipconfig查看物理主机的ip地址2.根据物理主机的ip地址,设置linux虚拟机的ip地址:注意最好把#和后面的文字删除vim/etc/sysconfig/network-scripts/ifcfg-eth0(注意Centos7是ifcfg-ens33)ONBOOT=yes      #开机启用网络配置。BOOTPROTO=static      #static,静态......
  • Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误
    按照之前我写的文章教程,可以很简单的编译出静态库(仅供学习交流)编译windows上的qt静态库编译出静态库后,替换旧版本的库,见我另一篇文章教程VS2019配置QT库之所以没有直接上Qt6.0以上的版本,是因为Qt6.0对比Qt5删减了不少东西(我之前已经测试过了),这就导致项目要有......
  • 业务扩展:图灵机器人调用(API)接口模式的开发流程及其注意事项
    业务场景:在网站添加一个可以回答用户问题的对话机器人;解决方案:使用三方图灵机器人(turing)进行语料库控制,数据统计,问题反馈等;操作流程:1、申请图灵开发者账号权限,官网网站:http://www.tuling123.com/2、购买相应套餐获取机器人功能,完成认证之后可获得免费版,未完成认证则需要完成套......