qt学习——QMainWindow、基本控件

news2024/11/27 0:38:40

初识qt

    • **QMainWindow——菜单栏和工具栏**
    • **状态栏、铆接部件、核心部件**
    • **资源文件得添加**
    • **模态和非模态对话框创建**
    • **消息对话框**
    • **其它标准对话框**
    • **登录窗口布局**
    • **控件按钮组**
    • **QListWidget控件**
    • **QTreeWidget树控件**
    • **QTableWidget控件**
    • **其他常用控件介绍**
    • **自定义控件**

QMainWindow——菜单栏和工具栏

在这里插入图片描述

#include "mainwindow.h"
#include<QMenuBar>
#include<QToolBar>
#include<Qdebug>
#include<QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //重置窗口大小
    resize(600,400);

    //菜单栏  最多只能有一个
    //菜单栏的创建
    //menuBar()是MainWindow里面的一个成员函数 不用new
    QMenuBar * bar = menuBar();
    //将菜单栏放入到窗口中
    setMenuBar(bar);
    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * ecitMenu = bar->addMenu("编辑");
    //创建菜单项
    QAction * newAction = fileMenu->addAction("新建");
    //添加分隔线
    fileMenu->addSeparator();
    //创建菜单项
    QAction * openAction = fileMenu->addAction("打开");

    //qDebug()<<"aaa";
    //工具栏  可以有多个
    QToolBar * toolBar = new QToolBar(this);
    addToolBar("toolBar");
    //第一个参数是默认左边  是枚举值
    addToolBar(Qt::LeftToolBarArea,toolBar);
    //后期设置 只允许 左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //设置浮动(不让它浮动)
    toolBar->setFloatable(false);
    //设置移动(总开关) 把它设置为false上面的所有设置都废掉了
    //toolBar->setMovable(false);
    //工具栏中可以设置内容
    toolBar->addAction(newAction);
    //添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    //工具栏中添加控件  前面写的按钮也属于控件
    QPushButton * btn=new QPushButton("aa",this);
    toolBar->addWidget(btn);
}

MainWindow::~MainWindow()
{
}


状态栏、铆接部件、核心部件

#include "mainwindow.h"
#include<QMenuBar>
#include<QToolBar>
#include<Qdebug>
#include<QPushButton>
#include<QStatusBar>
#include<QLabel>
#include<QDockWidget>
#include<QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //重置窗口大小
    resize(600,400);

    //菜单栏  最多只能有一个
    //菜单栏的创建
    //menuBar()是MainWindow里面的一个成员函数 不用new
    QMenuBar * bar = menuBar();
    //将菜单栏放入到窗口中
    setMenuBar(bar);
    //创建菜单
    QMenu * fileMenu = bar->addMenu("文件");
    QMenu * ecitMenu = bar->addMenu("编辑");
    //创建菜单项
    QAction * newAction = fileMenu->addAction("新建");
    //添加分隔线
    fileMenu->addSeparator();
    //创建菜单项
    QAction * openAction = fileMenu->addAction("打开");

    //qDebug()<<"aaa";


    //工具栏  可以有多个
    QToolBar * toolBar = new QToolBar(this);
    addToolBar("toolBar");
    //第一个参数是默认左边  是枚举值
    addToolBar(Qt::LeftToolBarArea,toolBar);
    //后期设置 只允许 左右停靠
    toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
    //设置浮动(不让它浮动)
    toolBar->setFloatable(false);
    //设置移动(总开关) 把它设置为false上面的所有设置都废掉了
    //toolBar->setMovable(false);
    //工具栏中可以设置内容
    toolBar->addAction(newAction);
    //添加分割线
    toolBar->addSeparator();
    toolBar->addAction(openAction);
    //工具栏中添加控件  前面写的按钮也属于控件
    QPushButton * btn=new QPushButton("aa",this);
    toolBar->addWidget(btn);


    //状态栏  最多有一个
    QStatusBar * stBar = statusBar();
    //设置到窗口中
    setStatusBar(stBar);
    QLabel * label = new QLabel("提示信息",this);

    QLabel * label2 = new QLabel("右侧的提示信息",this);
    stBar->addPermanentWidget(label2);

    //铆接部件 (浮动窗口)  可以有多个
    QDockWidget * dockWidget = new QDockWidget("浮动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
    //设置铆接不见的停靠区域  只允许上下
    dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
    //设置中心部件 只能一个  类似于输入的界面
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);
    //记忆技巧  可以有多个添加用add  只能有一个用set
}

MainWindow::~MainWindow()
{
}


资源文件得添加

将图片文件拷贝到项目位置下
右键项目->添加新文件->Qt->Qt recourse File->给资源文件起名res
生成res.arc
open in editor编辑资源
添加前缀 添加文件
使用“:+前缀名+文件名”

在这里插入图片描述

模态和非模态对话框创建

在Lambda表达式中,可以使用捕获列表来捕获外部变量。捕获列表可以是空的,也可以包含一个或多个捕获符号。其中,常用的捕获符号有以下两种:

  1. [=]:表示以值传递的方式捕获所有外部变量,即Lambda表达式中使用的所有外部变量都会被复制一份到Lambda表达式的内部,以保证Lambda表达式在执行时可以访问这些变量的值。
  2. [this]:表示以值传递的方式捕获当前对象的指针,即Lambda表达式中可以使用当前对象的成员变量和成员函数。
    例如,下面的Lambda表达式使用了捕获列表:
int x = 10;
auto f = [=]() { return x + 1; }; // 捕获x,并以值传递的方式复制到Lambda表达式内部
auto g = [this]() { return this->x + 1; }; // 捕获当前对象的指针,并可以访问当前对象的成员变量x
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>

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

    //点击信号按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=]()
    {
        //对话框  分类
        //模态对话框(不可以对其他窗口进行操作)  非模态对话框(可以对其他窗口进行操作)
        //模态创建    阻塞
//        QDialog dlg(this);
//        dlg.resize(400,400);
//        dlg.exec();//阻塞的作用
//        qDebug()<<"模态对话框弹出了";

        //非模态对话框
//        QDialog dlg2(this);
//        dlg2.show();//栈区  会被释放掉

        //防止一闪而过放在堆区
        QDialog * dlg2 = new QDialog(this);//点大窗口的叉才会释放this内存 小窗口的叉不会释放this的内存
        dlg2->resize(400,400);
        dlg2->show();
        dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 的属性
        qDebug()<<"非模态对话框弹出了";
        
    });
}

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

在上面的例子中,Lambda表达式f使用了捕获列表[=],表示以值传递的方式捕获外部变量x,并将其复制到Lambda表达式内部。Lambda表达式g使用了捕获列表[this],表示以值传递的方式捕获当前对象的指针,并可以访问当前对象的成员变量x。
dlg.exec() 是 Qt 中 QDialog 类的一个成员函数,用于显示对话框并阻塞程序,直到用户关闭对话框为止。

当程序执行到 dlg.exec() 时,程序会停止执行,直到用户关闭对话框。这是因为 exec() 函数会创建一个事件循环,用于处理用户与对话框的交互事件。只有当用户关闭对话框,或者调用了 dlg.reject()dlg.accept() 函数时,事件循环才会结束,exec() 函数才会返回。

因此,如果你需要在用户关闭对话框之后继续执行程序,可以在 exec() 函数之后添加相应的代码。如果你需要在对话框显示期间执行一些操作,可以将这些操作放在 exec() 函数之前。

消息对话框

在这里插入图片描述
在C++中,静态成员函数可以通过以下两种方式进行访问:

  1. 使用类名调用静态成员函数

静态成员函数可以通过类名直接调用,不需要创建类的实例。例如:

class MyClass {
public:
    static void myStaticFunction() {
        // 静态成员函数的实现
    }
};

// 调用静态成员函数
MyClass::myStaticFunction();
  1. 使用对象调用静态成员函数

虽然静态成员函数不依赖于类的实例,但是它们仍然可以通过类的实例进行访问。例如:

class MyClass {
public:
    static void myStaticFunction() {
        // 静态成员函数的实现
    }
};

// 创建类的实例
MyClass myObject;

// 使用对象调用静态成员函数
myObject.myStaticFunction();

需要注意的是,使用对象调用静态成员函数并不会访问对象的成员变量,因为静态成员函数不依赖于类的实例。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include<QMessageBox>

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

    //点击信号按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=]()
    {
        //对话框  分类
        //模态对话框(不可以对其他窗口进行操作)  非模态对话框(可以对其他窗口进行操作)
        //模态创建    阻塞
//        QDialog dlg(this);
//        dlg.resize(400,400);
//        dlg.exec();//阻塞的作用
//        qDebug()<<"模态对话框弹出了";

        //非模态对话框
//        QDialog dlg2(this);
//        dlg2.show();//栈区  会被释放掉

        //防止一闪而过放在堆区
//        QDialog * dlg2 = new QDialog(this);//点大窗口的叉才会释放this内存 小窗口的叉不会释放this的内存
//        dlg2->resize(400,400);
//        dlg2->show();
//        dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 的属性
//        qDebug()<<"非模态对话框弹出了";


        //消息对话框
        //错误对话框
        //这里使用类名来调用静态成员函数
//        QMessageBox::critical(this,"critical","错误");

        //信息对话框
//        QMessageBox::information(this,"info","信息");

        //问题对话框
        //第一个参数是父对象  第二个参数是标题  参数3  提示内容  参数4  按键类型  参数5   默认关联回车的按键
        //这是一个Qt框架中的代码,用于在界面上弹出一个询问框,询问用户是否要保存当前操作。
        //如果用户点击保存按钮,则返回QMessageBox::Save,否则返回QMessageBox::Cancel。
//        if(QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Cancel))
//        {
//            qDebug()<<"选择的是保存";
//        }
//        else
//        {
//            qDebug()<<"选择的是取消";
//        }

        //警告对话框
        QMessageBox::warning(this,"warning","警告");
    });
}

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

其它标准对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include<QMessageBox>
#include<QColorDialog>
#include<QFileDialog>
#include<QFontDialog>

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

    //点击信号按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=]()
    {
        //对话框  分类
        //模态对话框(不可以对其他窗口进行操作)  非模态对话框(可以对其他窗口进行操作)
        //模态创建    阻塞
//        QDialog dlg(this);
//        dlg.resize(400,400);
//        dlg.exec();//阻塞的作用
//        qDebug()<<"模态对话框弹出了";

        //非模态对话框
//        QDialog dlg2(this);
//        dlg2.show();//栈区  会被释放掉

        //防止一闪而过放在堆区
//        QDialog * dlg2 = new QDialog(this);//点大窗口的叉才会释放this内存 小窗口的叉不会释放this的内存
//        dlg2->resize(400,400);
//        dlg2->show();
//        dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号 的属性
//        qDebug()<<"非模态对话框弹出了";


        //消息对话框
        //错误对话框
        //这里使用类名来调用静态成员函数
//        QMessageBox::critical(this,"critical","错误");

        //信息对话框
//        QMessageBox::information(this,"info","信息");

        //问题对话框
        //第一个参数是父对象  第二个参数是标题  参数3  提示内容  参数4  按键类型  参数5   默认关联回车的按键
        //这是一个Qt框架中的代码,用于在界面上弹出一个询问框,询问用户是否要保存当前操作。
        //如果用户点击保存按钮,则返回QMessageBox::Save,否则返回QMessageBox::Cancel。
//        if(QMessageBox::Save == QMessageBox::question(this,"ques","提问",QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Cancel))
//        {
//            qDebug()<<"选择的是保存";
//        }
//        else
//        {
//            qDebug()<<"选择的是取消";
//        }

        //警告对话框
//        QMessageBox::warning(this,"warning","警告");
        //参数 r  g  b  红  绿  蓝
        //255是透明度  默认为不透明
        //返回值是它颜色的信息
//       QColor color =  QColorDialog::getColor(QColor(255,0,0));
//        qDebug()<<"r = "<<color.red()<<"g = "<<color.green()<<"b = "<<color.blue();

        //文件对话框
        //参数1  父亲  参数2 标题   参数3  路径  参数4  过滤文件的格式
        //返回值是选取的路径
//        QString str = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\86199\\Desktop","(*.txt)");
//        qDebug()<<str;

        //字体对话框
        bool flag;
       QFont font =  QFontDialog::getFont(&flag,QFont("华文彩云",36));
       //QString打印有冒号   因此要转化为char *类型
       //qDebug()<<"字体:"<<font.family()<<"字号 : "<<font.pointSize()<<"是否加粗 "<<font.bold()<<"是否倾斜"<<font.italic();
       qDebug()<<"字体:"<<font.family().toUtf8().data()<<"字号 : "<<font.pointSize()<<"是否加粗 "<<font.bold()<<"是否倾斜"<<font.italic();
    });
}

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

登录窗口布局

实现登陆窗口
利用布局方式给窗口进行美化
选取widget进行布局,水平布局、垂直布局、栅格布局给用户名、密码、登陆、退出按钮进行布局
默认窗口和控件之间有9间隙,可以调整layoutLeftMarginv利用弹备进行布局

在这里插入图片描述
在这里插入图片描述

控件按钮组

#include "widget.h"
#include<QDebug>
#include "ui_widget.h"

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

    //设置单选按钮 男默认选中
    ui->rBtnMan->setChecked(true);

    //选中女后  打印信息
    connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
        qDebug()<<"选中女人了!";
    });

    //多选按钮
    //信号的参数要大于等于槽函数的参数  并且类型要一致  信号参数自动能传递给槽函数
    //2是选中   0是未选中  1表示半选状态
    connect(ui->cBox,&QCheckBox::stateChanged,[=](int state) {
        qDebug()<<state;
    });
}

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

在这里插入图片描述
QPushButton常用按钮
QToolButton工具按钮用于显示图片,如图想显示文字,修改风格:toolButtonstyle ,凸起风格autoRaise
radioButton单选按钮,设置默认ui->rBtnMan->setChecked(true); checkbox多选按钮,监听状态,2选中1半选О未选中

QListWidget控件

#include "widget.h"
#include<QDebug>
#include "ui_widget.h"
#include <QListWidgetItem>

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

    //设置单选按钮 男默认选中
    ui->rBtnMan->setChecked(true);

    //选中女后  打印信息
    connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
        qDebug()<<"选中女人了!";
    });

    //多选按钮
    //信号的参数要大于等于槽函数的参数  并且类型要一致  信号参数自动能传递给槽函数
    //2是选中   0是未选中  1表示半选状态
    connect(ui->cBox,&QCheckBox::stateChanged,[=](int state) {
        qDebug()<<state;
    });

    //利用listWidget写诗
    //在Qt中,当你使用`new`创建一个`QListWidgetItem`对象并将其添加到`QListWidget`中时
    //`QListWidget`会自动管理这个对象的内存,因此你不需要手动释放它。当你从`QListWidget`中删除这个对象时
    //`QListWidget`会自动释放它的内存。所以,你不需要手动释放这个对象。
//    QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
//    //将一行诗放入到listWidget控件中
//    ui->listWidget->addItem(item);
//    item->setTextAlignment(Qt::AlignHCenter);

    //QStringList 等价 QList<QString>
    QStringList list;
    //这里重载了左移运算符
    list<<"锄禾日当午"<<"汗滴禾下土"<<"谁知盘中餐"<<"粒粒皆辛苦";
    ui->listWidget->addItems(list);
}

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

QListwidgetitem " item一行内容
ui->listwidget ->addltem ( item )
设置居中方式item->setTextAlignment(Qt:AlignHCenter);
可以利用additems一次性添加整个诗内容

在这里插入图片描述

QTreeWidget树控件

QStringList() 是一个空的 QString 列表,它是 Qt 框架中的一个类。QStringList 类用于存储一组字符串,可以通过 append()prepend()insert()remove() 等方法来操作列表中的元素。QStringList 类通常用于处理字符串列表,例如命令行参数、文件路径列表等。

#include "widget.h"
#include "ui_widget.h"


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

    //树控件的使用
    //treewidget
    //匿名对象
    ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄介绍");
    QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量");
    QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList()<<"敏捷");
    QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList()<<"智力");

    ui->treeWidget->addTopLevelItem(liItem);
    ui->treeWidget->addTopLevelItem(minItem);
    ui->treeWidget->addTopLevelItem(zhiItem);

    //追加子节点
    QStringList heroL1;
    heroL1<<"王浩宇1"<<"前排坦克,能够吸收伤害的同时造成可观的范围输出";
    QTreeWidgetItem * li = new QTreeWidgetItem(heroL1);
    liItem->addChild(li);

    QStringList heroL2;
    heroL2<<"王浩宇2"<<"后排辅助法师,能够射出乳白色液体同时造成可观的范围控制";
    QTreeWidgetItem * ld = new QTreeWidgetItem(heroL2);
    liItem->addChild(ld);

}

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

在这里插入图片描述

QTableWidget控件

#include "widget.h"
#include "ui_widget.h"

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

    //TableWidget控件
    //设置列数
    ui->tableWidget->setColumnCount(3);

    //设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");

    //设置行数
    ui->tableWidget->setRowCount(5);

    //设置正文
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
    //这段代码是在Qt中使用QTableWidget控件
    //将第一行第一列的单元格设置为文本“亚瑟”。
    //其中,ui是指当前窗口的界面对象,tableWidget是指QTableWidget控件的对象。
    //setItem()是QTableWidget控件的一个函数,用于设置单元格的内容。
    //第一个参数是行号,第二个参数是列号,第三个参数是一个QTableWidgetItem对象,用于设置单元格的内容。
    //在这里,我们使用了QTableWidgetItem的子类QTableWidgetItem的构造函数
    //这里其实是匿名的构造函数
    //将“亚瑟”作为参数传入,创建了一个QTableWidgetItem对象
    //并将其作为第三个参数传入setItem()函数中,从而将单元格的内容设置为“亚瑟”。

    QStringList nameList;
    nameList<<"亚瑟"<<"赵云"<<"张飞"<<"关羽"<<"花木兰";

    QList<QString>sexList;
    sexList<<"男"<<"男"<<"男"<<"男"<<"女";

    for(int i = 0 ; i < 5 ;i++)
    {
        int col = 0;
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(nameList[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexList.at(i)));
        //int   转为   QString
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(i+18)));
    }

}

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


在这里插入图片描述

其他常用控件介绍

#include "widget.h"
#include "ui_widget.h"
#include <QMovie>

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

    //栈控件的使用


    //设置一个默认值
    ui->stackedWidget->setCurrentIndex(1);

    //scrollArea按钮
    //信号发生者:btn_scrollArea  信号:&QPushButton::click()
    connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
        ui->stackedWidget->setCurrentIndex(1);
    });

    connect(ui->btn_TabWidget,&QPushButton::clicked,[=](){
        ui->stackedWidget->setCurrentIndex(2);
    });

    connect(ui->btn_ToolBox,&QPushButton::clicked,[=](){
        ui->stackedWidget->setCurrentIndex(0);
    });

    //下拉框
    ui->comboBox->addItem("奔驰");
    ui->comboBox->addItem("玛莎拉蒂");
    ui->comboBox->addItem("宝马");

    connect(ui->btn_select,&QPushButton::clicked,[=](){
        //ui->comboBox->setCurrentIndex(2);
        ui->comboBox->setCurrentText("宝马");
    });

    //利用QLabel显示图片
    ui->lbl_Image->setPixmap(QPixmap(":/Image/luqiya.jpg"));
    ui->lbl_Image->setScaledContents(true);
    //利用QLabel显示动态图片
    QMovie * movie = new QMovie(":/Image/maliao.gif");
    ui->lbl_movie->setMovie(movie);
    ui->lbl_movie->setScaledContents(true);
    //播放动图
    movie->start();
}

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


stackedWidget核控件
ui->stackedWidget–setcurrentlndex(1);
下拉框
ui->comboBox->addltem(“奔驰”);
Qlabel显示图片
ui->lbl.Image–setPixmap(QPixmap(“路径”)
Qlabel显示动图gif图片
ui->lbl.movie–setMovie(movie);
movie->start();

自定义控件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
自定义的控件如下所示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

踩坑_vertical-align

目录 问题&#xff1a;vertical-align属性语法父元素的基线怎么找呢&#xff1f;特殊元素的基线行盒 解决 问题&#xff1a; 今天在做一个需求时遇到了如下问题&#xff1a; 代码 <style>*{margin:0;padding:0;}#app{width: 300px;height: 117px;background: #FFFFFF;bo…

验证回文串(力扣)双指针 JAVA

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#xf…

访客报警定位管理系统:提升安全管理水平的创新解决方案

在当前日益复杂的安全环境下&#xff0c;保障人员安全、提高安全响应能力和管理效率成为了各行各业的首要任务。 作为一种先进的安全管理解决方案&#xff0c;访客报警定位管理系统凭借其独特的优势和广泛的应用场景&#xff0c;正逐渐成为各行业安全管理的重要工具。 那么&a…

web前端设计师的主要职责说明(合集)

web前端设计师的主要职责说明1 职责&#xff1a; 1. 根据UI设计师提供的设计图&#xff0c;实现一流的Web界面&#xff0c;优化代码并保持在各浏览器下良好的兼容性; 2. Web前端表现层及与后端交互的架构设计和开发; 3. JavaScript程序模块开发&#xff0c;通用类库、框架编…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…

【本地电脑搭建Web服务器并用cpolar发布至公网

本地电脑搭建Web服务器并用cpolar发布至公网访问 随着互联网的快速发展&#xff0c;网络也成为我们生活中不可缺少的必要条件&#xff0c;为了能在互联网世界中有自己的一片天地&#xff0c;建立一个属于自己的网页就成为很多人的选择。但互联网行业作为资本密集的行业&#x…

企业网络安全合规框架体系

云安全联盟大中华区发布报告《企业网络安全合规框架体系》&#xff08;以下简称报告&#xff09;&#xff0c;该报告对典型业务场景给出了参考实例&#xff0c;供广大甲方单位、集成商、咨询机构参考。 近些年&#xff0c;随着国内网络安全领域相关法律、法规、政策文件、标准规…

Seata部署(Centos和Docker)

一、简介 Seata 是一款开源的分布式事务框架。致力于在微服务架构下提供高性能和简单易用的分布式事务服 务。在 Seata 开源之前&#xff0c;Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的⻆ 色&#xff0c;帮助经济体平稳的度过历年的双11&#xff0c…

Unity+chatgpt+webgl实现声音录制+语音识别

一、前言 AI二次元女友这个项目持续更新&#xff0c;在window端的语音识别和语音合成的功能&#xff0c;在上一篇博文里已经详细说明了微软Azure语音服务的代码实现。也是为了实现一次代码&#xff0c;多端复用这样的诉求&#xff0c;所以全部的代码实现都改成了web api的方式…

openSUSE leap 15.3安装mysql-community-server

openSUSE Software 下载"https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" wget "https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" 双击"mysql-community-server.ymp" 添…

Flutter Windows通过嵌入Native窗口实现渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频&#xff08;本章&#xff09; 文章目录 Flutter视频渲染系列前言…

FPGA XDMA 中断模式实现 PCIE3.0 QT上位机图片传输 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案图像产生、发送、缓存XDMA简介XDMA中断模式图像读取、输出、显示QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采…

【深度学习之YOLO8】环境部署

目录 一、确定版本CUDA toolkit、cuDNN版本Python、PyTorch版本 二、安装Python下载环境变量验证安装 三、安装Anaconda安装环境变量验证安装创建conda虚拟环境常用命令 四、安装CUDA toolkit下载环境变量验证安装 五、配置cuDNN下载 六、安装PyTorch(torchtorchversiontorchau…

JavaWeb课程设计项目实战(05)——项目编码实践2

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 在本节教程中&#xff0c;我们完成项目的登录功能。 User 请在bean包中创建User类&#xff0c;代码如下&#xff1a; package com.cn.bean; /*** 本文作者&#xff1a;谷…

离线安装mysql8

一、先前往官网下载mysql8 下载地址&#xff1a; https://dev.mysql.com/downloads/ 选择Linux 二、删除Linux中的mysql&#xff08;如果有的话&#xff09;&#xff0c;上传安装包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql 如果使用…

集成了Eureka的应用启动失败,端口号变为8080

问题 报错&#xff1a;集成了Eureka的应用启动失败&#xff0c;端口号变为8080。 原来运行的项目&#xff0c;突然报错&#xff0c;端口号变为8080&#xff1a; Tomcat initialized with port(s): 8080 (http)并且&#xff0c;还有如下的错误提示&#xff1a; RedirectingE…

keil5编辑器主题配色美化使用(附六款暗黑主题)

一、通过配置文件修改主题 1、在软件安装目下备份以下三个文件&#xff0c;更换主题只需要替换global.prop arm.propglobal.propglobal.prop.def 2、替换配置文件 将已经准备好的配色文件复制到\UV4下替换 https://download.csdn.net/download/qq_43445867/88064961 Theme1…

通讯录--动态版

简易的通讯录往往需要朴实的“烹饪”就能完成一道“美味的佳肴”。 我们需要一个通讯录&#xff0c;能够存储联系人的信息&#xff0c;能够对联系人的信息进行增删查改&#xff0c;查询&#xff0c;按姓名排序。相比对之前的三子棋、扫雷&#xff0c;有了一定的了解&#xff0c…

git commit -m时候没有保存package.json等文件

项目场景&#xff1a; 提示&#xff1a;git add . 和 git commit -m "保存" 操作&#xff0c;没有保存package.json等文件。 解决方案&#xff1a; 1.确保 package.json 文件没有被列在 .gitignore 文件中。打开 .gitignore 文件&#xff0c;检查是否有类似于 packa…

数据库运维——备份恢复

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(…