面向对象的Qt编程

2023-10-27

0.面向对象的Qt编程

完全不适用任何面向对象技术,而只是利用Qt所提供的类创建对象,并调用对象的接口以满足用户的需求是可能的,但这样构建的应用程序其功能必然是十分有限的。
首先,Qt类保护成员中的诸多实现无法在类的外部被复用,Qt试图通过多态实现的很多机制,如事件处理,完全无法使用。
再次,Qt提供的信号和槽不可能满足用户所有的需求,自定义信号和槽需要面向对象技术。
最后,Qt设计师,Qt创造器等工具链都在以面向对象的方式使用Qt,反其道而行之不会有好结果。

1.通过面向对象的编程思想实现加法计算器

  • 输入两个数字,按"="按钮显示计算结果
  • 两个操作数必须都是合法的数字,拒绝结构任何非法字符
  • 两个操作数必须全部合法,“=”按钮才被激活,否则禁用(不可以点击)
  • 显示结果的空间只可查看不可修改,但支持复制到粘贴板
  • 所有子窗口的大小和位置随主窗口的缩放自动调整至最佳

dialog.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit> // 行编辑控件
#include <QHBoxLayout> // 水平布局器
#include <QDoubleValidator> // 验证器

#pragma execution_character_set("utf-8")


QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public slots:
    // 使能等号按钮的槽操作数
    void enableButton(void);
    // 计算结果和显示的槽函数
    void calcClicked(void);

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

private:
    Ui::Dialog *ui;
    QLineEdit* m_editX; // 左操作数
    QLineEdit* m_editY; // 右操作数
    QLineEdit* m_editZ; // 显示结果
    QLabel* m_label; // "+"
    QPushButton* m_button; // "="等号按钮
};
#endif // DIALOG_H

dialog.cpp:

#include "dialog.h"
#include "ui_dialog.h"

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

    // 界面初始化
    setWindowTitle("计算器");
    // 左操作数,this即为当前父窗口指针
    m_editX=new QLineEdit(this);
    // 设置文本对齐方式:右对齐
    m_editX->setAlignment(Qt::AlignRight);
    // 设置数字验证器,只能输入数字形式内容
    m_editX->setValidator(new QDoubleValidator(this));
    // 右操作数
    m_editY=new QLineEdit(this);
    m_editY->setAlignment(Qt::AlignRight);
    m_editY->setValidator(new QDoubleValidator(this));
    // 显示结果控件
    m_editZ=new QLineEdit(this);
    m_editZ->setAlignment(Qt::AlignRight);
    m_editZ->setReadOnly(true); // 设置只读
    // "+"
    m_label=new QLabel("+",this);
    // "="
    m_button=new QPushButton("=",this);
    m_button->setEnabled(false);//设置禁用

    // 创建布局器:自动调用每个控件的大小和位置
    QHBoxLayout* layout = new QHBoxLayout(this);
    // 按水平方向,依次将控件添加到布局器中
    layout->addWidget(m_editX);
    layout->addWidget(m_label);
    layout->addWidget(m_editY);
    layout->addWidget(m_button);
    layout->addWidget(m_editZ);
    // 设置布局器
    setLayout(layout);

    // 信号和槽函数连接
    // 左右操作数文本改变时,发送信号textChanged()
    connect(m_editX,SIGNAL(textChanged(QString)),
            this,SLOT(enableButton(void)));
    connect(m_editY,SIGNAL(textChanged(QString)),
            this,SLOT(enableButton(void)));
    // 点击按钮,发送信号clicked
    connect(m_button,SIGNAL(clicked(void)),
            this,SLOT(calcClicked(void)));
}

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

// 使能等号按钮的槽操作数
void Dialog::enableButton(void)
{
    bool bXOk,bYOk;
    // text():获取输入文本(QString)
    // toDouble():QString转换为double,参数保存转换是否成功结果
    m_editX->text().toDouble(&bXOk);
    m_editY->text().toDouble(&bYOk);
    // 当左右操作数都输入了有效数据,则使能等号按钮,否则设置禁用
    m_button->setEnabled(bXOk && bYOk);
}

// 计算结果和显示的槽函数
void Dialog::calcClicked(void)
{
    double res = m_editX->text().toDouble() +
            m_editY->text().toDouble();
    // number():将double转换为QString
    QString str = QString::number(res);
    // 显示字符串形式结果
    m_editZ->setText(str);
}

2.案例:获取系统时间

要求:

  • 使用面向对象的Qt编程技术创建获取时间窗口
  • 点击按钮,通过自定义的槽函数获取时间并显示到标签
    dialog.h:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout> // 垂直布局器
#include <QTime> // 获取时间
#include <QDebug> // 打印调试

#pragma execution_character_set("utf-8")

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

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

public slots:
    void getTime(void); // 获取时间的槽函数

signals:
    // 自定义信号函数,只需声明,不能写定义
    void mySignal(const QString&);

private:
    Ui::Dialog *ui;
    QLabel* m_label; // 显示时间label
    QPushButton* m_button; // 获取时间button

};
#endif // DIALOG_H

dialog.cpp:

#include "dialog.h"
#include "ui_dialog.h"
#include <QFont>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
    // 初始化界面
    // 显示时间标签控件
    m_label = new QLabel(this);
    // 设置label边框消息,凹陷面板
    m_label->setFrameStyle(QFrame::Panel|QFrame::Sunken);
    // 设置label文本对齐方式:水平/垂直居中
    m_label->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    // 设置label的字体大小
    QFont font;
    font.setPointSize(20);
    m_label->setFont(font);

    // 获取系统时间的按钮
    m_button = new QPushButton("获取当前时间",this);
    m_button->setFont(font);

    // 创建垂直布局器
    QVBoxLayout* layout=new QVBoxLayout(this);
    layout->addWidget(m_label);
    layout->addWidget(m_button);
    // 设置布局器
    setLayout(layout);

    // 信号和槽函数连接
    connect(m_button,SIGNAL(clicked()),
            this,SLOT(getTime(void)));

    // 通过自定义信号,触发label的setText函数执行
    connect(this,SIGNAL(mySignal(QString)),
            m_label,SLOT(setText(QString)));

}

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

// 获取系统时间的槽函数
void Dialog::getTime(void)
{
    qDebug("getTime");
    qDebug()<<"getTime";
    // 获取当前系统时间
    QTime time = QTime::currentTime();
    // 将时间对象转换为字符串
    QString str = time.toString("hh:mm:ss");
    // 显示时间
    //m_label->setText(str);

    // emit:是Qt关键字,标记当前是发射信号
    emit mySignal(str); // 发射信号
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象的Qt编程 的相关文章

随机推荐

  • oppo笔试印象

    选择 20道考察了计算机组成中 最先存储 最优存储 最小桶排序 平衡二叉树成功比较次数 检索方法r tree b tree数组 哈希 计算机网络 传输层 第0层 操作系统死锁等 笔试第一题 忘记了 笔试第二题 找规律 第一层循环宏观上遍历6
  • 跟我一起写 Makefile(七)

    跟我一起写 Makefile 七 本文来自于CSDN 陈皓博主 网址http blog csdn net haoel article details 2892 详细内容请参考其经典文章 跟我一起写makefile 陈皓
  • Unity使用c#开发HoloLens2项目(十八)(使用MRTK后点击 Holographic Remoting For Play Mode无反应或Remote Host Port是多少)

    文章目录 成品展示 前言 问题 在unity中Play项目无反应 点击瞬间跳出 1 选择MRTK并进入Holographic Remoting For Play Mode 2 进入远程编辑界面 3 检查IP及端口状态 4 参考GitHub内
  • jquery修改display属性

    jquery修改display属性
  • Spring AOP 详解

    Spring AOP 详解 一 什么是 Spring AOP 二 为何要用 AOP 三 Spring AOP 3 1 AOP 组成 3 1 1 切面 Aspect 3 1 2 连接点 Join Point 3 1 3 切点 Pointcut
  • 初学者使用MyBatis开发步骤详解

    MyBatis开发步骤 1 建表 create table t users id int primary key auto increment name varchar 50 password varchar 50 sex varchar
  • 请谈谈你对Hadoop的理解

    一 请谈谈你对Hadoop的理解 1 Hadoop是什么 What is Hadoop Hadoop是Apache软件基金会的一个开源项目 是一个分布式处理海量数据的软件框架 它为开发者提供了一个分布式系统的基础架构 用户可以在不了解分布式
  • 怎么在局域网中设置共享文件夹?

    在工作中 我们经常会使用到共享文件夹 它能很好的提高我们的工作效率 但是有些小伙伴却并不会设置 下面小编就来用图文为大家讲解一下如何设置共享文件夹 共享文件夹设置方法 1 在需要共享的文件夹上单击鼠标右键 选择 属性 2 在上方选项栏选择共
  • 蓝牙Bluetooth模块介绍

    1 蓝牙模块 基础知识介绍 https blog csdn net wwt18811707971 article details 77833602 2 常见蓝牙模块介绍和AT指令 https blog csdn net qlexcel ar
  • java logback.xml详解

    一 java日志输出演进 0 控制台输出 System out println 1 java标准库内置日志包 java util logging Logger logger Logger getGlobal logger info 局限性
  • 开源软件不等于免费软件(弄清开放源代码许可证很重要)

    转载 https www ramostear com blog 2020 04 09 xfz464y9 html 树下魅狐 似乎提到开源软件 往往给人一种错觉 我拿到了软件源代码 接下来我是不是可以大刀阔斧为所欲为 其实非也 开源软件不等于
  • clock函数的时间单位_简单的c++时间测量

    在生产系统上面 测量系统的运行性能 定位问题 都会用到一个参考值 就是某段代码对运行时间 这个功能时间也简单 就是在代码的开始位置以及结束位置各去执行一下时间获取的操作 然后求下得到的两个值的差值就能获得 像下面这代码一样 time t b
  • RESTful风格的优势是什么

    阅读 阮一峰 理解RESTful架构 http www ruanyifeng com blog 2011 09 restful 可以得知RESTful风格的特点如下 1 每一个URI代表一种资源 独一无二 2 客户端和服务器之间 传递这种资
  • html5表单组件,10 HTML5表单各种组件

    H5表单组件 H5的表单组件分为 文字组件 列表组件 选择组件 按钮组件 1 输入组件 输入组件的作用是让用户输入数据 输入组件包括 text textarea paaword H5新增的有date number color range等i
  • SLF4J 教程(自由在各种log中切换)

    http www blogjava net dreamstone archive 2007 07 09 128993 html 一 介绍 简单日记门面 simple logging Facade for java SLF4J是为各种logi
  • vue省市区三级联动插件(使用mint-ui的picker)

    用mint ui中的picker组件封装的省市区插件 使用环境 vue cli demo下载地址 https download csdn net download yanzyan 10516230 下载后 使用npm install命令生成
  • 参加GTC大会,抢先看懂游戏未来发展方向

    如果GPU是时光机 那么GTC就是窥探未来的窗口 Jensen Huang NVIDIA GTC 全称GPU Technology Conference GPU技术大会 本次的GTC国内站将会在苏州举办 历时3天 参与链接 http gtc
  • el-date-picker获取焦点方法

    小编为了实现日期控件在显示时候字段获得焦点的操作 研究了好一会儿 对比了其他的组件 最后终于实现了结果 和大家分享一下
  • 网页在线画图工具----方便简洁

    https www processon com diagrams
  • 面向对象的Qt编程

    0 面向对象的Qt编程 完全不适用任何面向对象技术 而只是利用Qt所提供的类创建对象 并调用对象的接口以满足用户的需求是可能的 但这样构建的应用程序其功能必然是十分有限的 首先 Qt类保护成员中的诸多实现无法在类的外部被复用 Qt试图通过多