QT核心内容(9.6)

1> 手写unique_ptr智能指针

代码:

cpp 复制代码
#include <iostream>
#include <cassert>

using namespace std;
template<typename T>
class my_unique_ptr {
private:
    T* ptr;

    // 禁止拷贝构造函数和拷贝赋值操作符
    my_unique_ptr(const my_unique_ptr&) = delete;
    my_unique_ptr& operator=(const my_unique_ptr&) = delete;

public:
    // 默认构造函数
    my_unique_ptr() : ptr(nullptr) {}

    // 构造函数,接受一个指针
    explicit my_unique_ptr(T* p) : ptr(p) {}

    // 移动构造函数
    my_unique_ptr(my_unique_ptr&& other) noexcept : ptr(other.ptr) {
        other.ptr = nullptr;
    }

    // 移动赋值操作符
    my_unique_ptr& operator=(my_unique_ptr&& other) noexcept {
        if (this != &other) {
            delete ptr;
            ptr = other.ptr;
            other.ptr = nullptr;
        }
        return *this;
    }

    // 析构函数
    ~my_unique_ptr() {
        delete ptr;
        cout<<"my_unique_ptr 析构"<<endl;
    }

    // 解引用操作符
    T& operator*() const {
        assert(ptr != nullptr);
        return *ptr;
    }

    // 箭头操作符
    T* operator->() const {
        assert(ptr != nullptr);
        return ptr;
    }

    // 释放所有权
    T* release() noexcept {
        T* temp = ptr;
        ptr = nullptr;
        return temp;
    }

    // 重置指针
    void reset(T* p = nullptr) {
        if (ptr != p) {
            delete ptr;
            ptr = p;
        }
    }

    // 检查是否为空
    bool operator==(nullptr_t) const noexcept {
        return ptr == nullptr;
    }

    // 检查是否非空
    bool operator!=(nullptr_t) const noexcept {
        return ptr != nullptr;
    }
};

// 使用示例
class Test {
public:
    Test() { cout << "Test 构造"<<endl; }
    ~Test() { cout << "Test 析构"<<endl; }
    void sayHello() { cout << "Hello"<<endl; }
};

int main() {
    my_unique_ptr<Test> ptr(new Test());
    ptr->sayHello();
    // ptr.reset(); // 取消注释以提前释放资源
    return 0; // Test 对象在这里被自动销毁
}

运行结果:

2> 手写登录界面,不允许拖拽,要求尽可能的美观

代码:

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>      //QT中信息调试类,用于输出数据,无需使用该类实例化对象,直接使用成员函数即可
#include <QIcon>
#include <QPushButton>
#include <QLabel>
#include <QMovie>
#include <QLineEdit>

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


    this->resize(400,300);          //更改当前界面的尺寸
    this->setMaximumSize(1000,900); //设置最大尺寸
    this->setMinimumSize(200,100);  //设置最小尺寸
    this->setFixedSize(500,300);    //设置固定尺寸


    //设置窗体图标
    this->setWindowIcon(QIcon("D:\\24061C++\\QT_day2\\1.png"));




    /**********************有关按钮的操作***********************/


    //构造按钮时,直接指定父组件
    QPushButton *btn1 = new QPushButton(this);
    btn1->setText("注册");
    btn1->move(0,260);                    //移动按钮位置
    btn1->resize(80,40);                    //设置按钮尺寸
    btn1->setIcon(QIcon("D:\\24061C++\\QT_day2\\pictrue\\zhuce.png"));                   //设置按钮图标

    //构造按钮时,指定父组件并且设置文本内容
    QPushButton *btn2 = new QPushButton("确定",this);
    btn2->resize(btn1->size());
    btn2->move(150,200);
    btn2->setIcon(QIcon("D:\\24061C++\\QT_day2\\pictrue\\queding.png"));

    //构造函数时,指定父组件并设置文本内容,并设置按钮图标
    QPushButton *btn3 = new QPushButton(QIcon("D:\\24061C++\\QT_day2\\pictrue\\quxiao.png"),"取消",this);
    btn3->resize(btn1->size());
    btn3->move(btn2->x()+btn2->width()+50,btn2->y());




    /************************标签文本*****************************/
    //1、使用无参构造完成构造一个标签
    QLabel *lab1 = new QLabel;
    lab1->setParent(this);          //设置父组件
    lab1->setText("账号:");         //设置文本内容
    lab1->move(100,110);     //设置坐标

    //2、使用有参构造完成构造一个标签
    QLabel *lab2 = new QLabel("密码:",this);
    lab2->move(lab1->x(),lab1->y()+40);

    //3、调用有无参构造,指定父组件,构造一个lab
    QLabel *lab3 = new QLabel(this);
    lab3->resize(500,100);
    lab3->setStyleSheet("background-color:pink;");

    //给标签设置动图
    //创建一个mocie对象
    QMovie *movie = new QMovie("D:\\24061C++\\QT_day2\\pictrue\\zz.gif");
    //将动图对象放入标签中
    lab3->setMovie(movie);
    //让动图动起来
    movie->start();

    //让标签内容自适应大小
    lab3->setScaledContents(true);

    //给标签设置静态图
    lab1->resize(30,30);
    lab1->setPixmap(QPixmap("D:\\24061C++\\QT_day2\\pictrue\\userName.jpg"));
    lab1->setScaledContents(true);
    lab2->resize(30,30);
    lab2->setPixmap(QPixmap("D:\\24061C++\\QT_day2\\pictrue\\passwd.jpg"));
    lab2->setScaledContents(true);





    /******************行编辑器类(QLIneEdit)***********************/
    //1、使用无参构造,构造一个行编辑器
    QLineEdit *edit1 = new QLineEdit;
    edit1->setParent(this);             //指定一个父组件
    edit1->resize(300,30);               //重新设置大小
    edit1->move(lab1->x()+lab1->width()+2,lab1->y());           //移动位置
    edit1->setPlaceholderText("账号");            //设置占位文本

    //2、使用有参构造完成构造一个行编辑器
    QLineEdit *edit2 = new QLineEdit("密码",this);
    edit2->resize(300,30);              //重新设置大小
    edit2->move(lab2->x()+lab2->width()+2,lab2->y());            //移动位置
    edit2->clear();             //清空内容
    edit2->setPlaceholderText("密码");            //设置占位文本
    edit2->setEchoMode(QLineEdit::Password);     //设置回显模式



}

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

运行结果:

3> 思维导图

相关推荐
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond4 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处5 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6255 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
锦亦之22336 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏6 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言