QT常见Layout布局器使用

布局简介

为什么要布局?通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定,不方便后期修改和维护;在Qt里面布局分为四个大类 :

盒子布局QBoxLayout

网格布局QGridLayout

表单布局:QFormLayout

抽屉布局:QStackedLayout

分页显示:QTabWidget

分割器:Splitter

设置布局的基本步骤:

 (1)创建控件
 (2)创建布局管理类
 (3)将控件添加到布局管理类中
 (4)设置布局管理类为此时的窗口布局

QBoxLayout

一般使用它的两个子类QHBoxLayout 和 QVBoxLayout 负责水平和垂直布局

QVBoxLayout 基本使用

mainwindow.cpp(后面例程都在mainwindow.cpp演示):

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include<QTextCodec>
#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("垂直布局"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* vlayout=new QVBoxLayout;
    QPushButton* b1=new QPushButton("b1");
    QPushButton* b2=new QPushButton("b2");
    QPushButton* b3=new QPushButton("b3");

    vlayout->addWidget(b1);
    vlayout->addWidget(b2);
    vlayout->addWidget(b3);

    centralWidget()->setLayout(vlayout);
    this->resize(200, 160);
}
MainWindow::~MainWindow()
{

}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

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

    return a.exec();
}

QHBoxLayout基本使用

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include<QTextCodec>
#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("水平布局"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QHBoxLayout* hlayout=new QHBoxLayout;
    QPushButton* b1=new QPushButton("b1");
    QPushButton* b2=new QPushButton("b2");
    QPushButton* b3=new QPushButton("b3");

    hlayout->addWidget(b1);
    hlayout->addWidget(b2);
    hlayout->addWidget(b3);

    centralWidget()->setLayout(hlayout);
    this->resize(100, 60);
}

 QHBoxLayout和QVBoxLayout综合使用

可以结合QGroupBox容器进行布局

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("垂直布局");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* container=new QVBoxLayout;

    QGroupBox *hobby_box = new QGroupBox("爱好");
    QVBoxLayout* v_layout=new QVBoxLayout;
    QRadioButton* btn1 = new QRadioButton("抽烟");
    QRadioButton* btn2 = new QRadioButton("喝酒");
    QRadioButton* btn3 = new QRadioButton("玩乐");
    v_layout->addWidget(btn1);
    v_layout->addWidget(btn2);
    v_layout->addWidget(btn3);
    hobby_box->setLayout(v_layout);

    QGroupBox* gender_box = new QGroupBox("性别");
    QHBoxLayout* h_layout = new QHBoxLayout();
    QRadioButton* btn4 =  new QRadioButton("男");
    QRadioButton* btn5 = new QRadioButton("女");
    h_layout->addWidget(btn4);
    h_layout->addWidget(btn5);
    gender_box->setLayout(h_layout);

    container->addWidget(hobby_box);
    container->addWidget(gender_box);

    centralWidget()->setLayout(container);
    this->resize(300, 300);
}

 

垂直和水平布局技巧 

可以根据需要灵活控制布局:

  • addStretch:添加拉伸条
  • setContentsMargins:设置边距
  • setStretchFactor:设置拉伸因子
  • setSpacing:设置每个控件之间距离
  • itemAt:获取布局内的控件元素

QGridLayout

QGridLayout基本使用

网格布局,有的人称之为九宫格布局;示例如下:

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("网格布局");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* container=new QVBoxLayout;

    QPushButton* m_buttons[20];
    const char* btnText[20] =
    {
        "7", "8", "9", "+", "(",
        "4", "5", "6", "-", ")",
        "1", "2", "3", "*", "<-",
        "0", ".", "=", "/", "C"
    };

    QLineEdit* edit = new QLineEdit();
    edit->setPlaceholderText("请输入内容");

    QGridLayout* grid = new QGridLayout();

    int line_number = 0;
    int col_number = 0;
    for(line_number = 0;line_number < 4;line_number++){
         // 此时line_number是第几行
        for(col_number = 0;col_number < 5;col_number++){
            // 此时col_number是第几列
            m_buttons[line_number*5 + col_number] = new QPushButton();
            m_buttons[line_number*5 + col_number]->setText(btnText[line_number*5 + col_number]);
            grid->addWidget(m_buttons[line_number*5 + col_number], line_number, col_number);
        }
    }
    container->addWidget(edit);
    container->addLayout(grid);

    centralWidget()->setLayout(container);
    this->resize(300, 300);
}

网格布局技巧

QFormLayout

QFormLayout基本使用

表单布局,一般适用于提交数据form表单。比如: 登录,注册类似的场景

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include<QTextCodec>
#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("表单布局"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* container=new QVBoxLayout;
    QFormLayout* form_layout = new QFormLayout();

    QLineEdit* edit1 = new QLineEdit();
    edit1->setPlaceholderText(chineseToQString("请输入账号"));
    form_layout->addRow(chineseToQString("账号:"), edit1);
    QLineEdit* edit2 = new QLineEdit();
    edit2->setPlaceholderText(chineseToQString("请输入密码"));
    form_layout->addRow((chineseToQString("密码:")), edit2);
 
    QPushButton* login_btn = new QPushButton(chineseToQString("登录"));
    login_btn->setFixedSize(100, 30);

    container->addLayout(form_layout);
    container->addWidget(login_btn,1,Qt::AlignRight);
    centralWidget()->setLayout(container);
    this->setFixedSize(300, 150);
}

表单布局技巧

QStackedLayout

QStackedLayout基本使用

抽屉式布局,或叫堆叠布局,提供了多页面切换的布局,一次只能看到一个界面。

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include <QTextCodec>
#include <QListWidget>
#include <QLabel>
#include <QStackedLayout>
#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("抽屉/堆叠布局"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QListWidget *listWidget = new QListWidget(); //创建一个列表
    listWidget->setMinimumWidth(150);
    listWidget->setFont(QFont("宋体",14));
    listWidget->addItem("QPushButton");
    listWidget->addItem("QLabel");
    listWidget->addItem("QLineEdit");

    //新建 3 个窗口,分别放置文本框、按钮和单行输入框
    QWidget *widget1 = new QWidget;
    widget1->setMinimumSize(400,400);
    QVBoxLayout* widget1Layout = new QVBoxLayout;
    QVBoxLayout* widget2Layout = new QVBoxLayout;
    QVBoxLayout* widget3Layout = new QVBoxLayout;

    QPushButton *but1 = new QPushButton(chineseToQString("这是一个按钮1"));
    QPushButton *but2 = new QPushButton(chineseToQString("这是一个按钮2"));
    widget1Layout->addWidget(but1);
    widget1Layout->addWidget(but2);
    widget1->setLayout(widget1Layout);

    QWidget *widget2 = new QWidget;
    widget2->setMinimumSize(400,400);
    QLabel *lab1 = new QLabel(chineseToQString("这是一个文本框1"));
    QLabel *lab2 = new QLabel(chineseToQString("这是一个文本框2"));
    widget2Layout->addWidget(lab1);
    widget2Layout->addWidget(lab2);
    widget2->setLayout(widget2Layout);

    QWidget *widget3 = new QWidget;
    widget3->setMinimumSize(400,400);
    QLineEdit* edit1 = new QLineEdit(chineseToQString("这是一个单行输入框1"));
    QLineEdit* edit2 = new QLineEdit(chineseToQString("这是一个单行输入框2"));
    widget3Layout->addWidget(edit1);
    widget3Layout->addWidget(edit2);
    widget3->setLayout(widget3Layout);

    //创建一个分组布局,将 3 个窗口添加到分组控件中
    QStackedLayout *stackedLayout = new QStackedLayout;
    stackedLayout->addWidget(widget1);
    stackedLayout->addWidget(widget2);
    stackedLayout->addWidget(widget3);

    QPushButton* changeBtn = new QPushButton(chineseToQString("点击切换界面"));

    QVBoxLayout* vLayout = new QVBoxLayout;
    QHBoxLayout* container=new QHBoxLayout;
    vLayout->addWidget(listWidget);
    vLayout->addWidget(changeBtn);
    container->addLayout(vLayout,1);
    container->addLayout(stackedLayout,4);
    centralWidget()->setLayout(container);

    //连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
    QObject::connect(listWidget,&QListWidget::currentRowChanged,stackedLayout,&QStackedLayout::setCurrentIndex);
    connect(changeBtn,&QPushButton::clicked,this,[=](){//也可以通过点击按钮循环切换
        int nextPage = (stackedLayout->currentIndex() + 1) % stackedLayout->count();
        stackedLayout->setCurrentIndex(nextPage);
    });
    this->setMinimumSize(600, 400);
}

抽屉布局技巧

QTabWidget

提供了便捷的分页显示功能,类似于编辑器中打开不同文件

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include <QTextCodec>
#include <QListWidget>
#include <QLabel>
#include <QStackedLayout>
#include <QTextEdit>

#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("QTabWidget"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QTextEdit* text1 = new QTextEdit(this);
    QTextEdit* text2 = new QTextEdit(this);
    QTextEdit* text3 = new QTextEdit(this);
    text1->setStyleSheet("background-color: red");
    text2->setStyleSheet("background-color: blue");
    text3->setStyleSheet("background-color: green");

    QTabWidget* tWidget = new QTabWidget(this);
    tWidget->addTab(text1,"test1.txt");
    tWidget->addTab(text2,"test2.txt");
    tWidget->addTab(text3,"test3.txt");

    tWidget->setTabsClosable(true); //设置可以关闭
    connect(tWidget,&QTabWidget::tabCloseRequested,this,[=](int index){
        tWidget->removeTab(index);//点击关闭后关闭此Tab
    });

    QHBoxLayout* container=new QHBoxLayout;
    container->addWidget(tWidget);
    centralWidget()->setLayout(container);

    this->setMinimumSize(600, 400);
}

 Splitter分割器

splitter允许用户通过拖动子部件之间的边界来控制它们的大小。任何数量的小部件都可以由单个拆分器控制。QSplitter的典型用法是创建几个小部件并使用 insertWidget()或addWidget()添加它们

#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include <QTextCodec>
#include <QListWidget>
#include <QLabel>
#include <QStackedLayout>
#include <QTextEdit>
#include <QSplitter>

#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("QSplitter"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    auto text1 = new QTextEdit(this);
    auto text2 = new QTextEdit(this);

    QSplitter* splitter = new QSplitter(this);
    splitter->addWidget(text1);
    splitter->addWidget(text2);
    splitter->setOpaqueResize(true);//设置为预览模式:false

    QVBoxLayout* container=new QVBoxLayout;
    container->addWidget(splitter);
    centralWidget()->setLayout(container);

    this->setMinimumSize(600, 400);
}

 鼠标放在中间的间隔上我们便可以左右拖动他们的距离

  Splitter分割器技巧

使用QSplitter实现分割窗口功能,整个对话框由四个窗口组成,各个窗口之间的大小可以任意拖拽来改变。
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>
#include <QFormLayout>
#include <QTextCodec>
#include <QListWidget>
#include <QLabel>
#include <QStackedLayout>
#include <QTextEdit>
#include <QSplitter>

#define chineseToQString(pChineseText)  QTextCodec::codecForName("GB2312")->toUnicode(pChineseText)

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle(chineseToQString("分割窗口"));
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0); //新建主分割窗口,水平分割

    QTextEdit *textLeft = new QTextEdit(chineseToQString("左部件"));
    textLeft->setAlignment(Qt::AlignCenter);//设置TextEdit对象中文本的对齐方式

    QSplitter *splitterRight = new QSplitter(Qt::Vertical);   //右分割窗口,并以主分割窗口作为父窗口
    splitterRight->setOpaqueResize(false);//若为true,则实时更新;否则在拖拽时显示一条虚线。

    QTextEdit *textUp = new QTextEdit(chineseToQString("上部件"));
    textUp->setAlignment(Qt::AlignCenter);

    QTextEdit *textMiddle = new QTextEdit(chineseToQString("中间部件"));
    textMiddle->setAlignment(Qt::AlignCenter);

    QTextEdit *textBottom = new QTextEdit(chineseToQString("底部部件"));
    textBottom->setAlignment(Qt::AlignCenter);

    splitterRight->addWidget(textUp);
    splitterRight->addWidget(textMiddle);
    splitterRight->addWidget(textBottom);

    textLeft->setParent(splitterMain);//左分割插入主分割窗口。
    splitterRight->setParent(splitterMain);//右边分割插入主分割窗口。
    splitterMain->setStretchFactor(1,1);//此函数用于设定:控件是否可伸缩。
    //第一个参数用于指定控件的序号。第二个函数大于0时,表示控件可伸缩,小于0时,表示控件不可伸缩。
    //splitterMain->setStretchFactor(1,0);//左右分割都可以伸缩

    QVBoxLayout* container=new QVBoxLayout;
    container->addWidget(splitterMain);
    centralWidget()->setLayout(container);

    this->setMinimumSize(400, 320);
}

其它相关技巧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

电饭煲/电磁炉/空调/机顶盒显示驱动芯片特点与相关型号推荐

电饭煲、电磁炉、空调和机顶盒等家用电器通常都包括数码管或LED显示&#xff0c;用于显示时间、温度、设置等信息。这些芯片通常具有多位数码管或LED的支持、亮度控制、多种字符和符号的显示、低功耗设计等功能。 电饭煲、电磁炉、空调和机顶盒等家用电器的显示驱动芯片通常是…

后端常问面经之计算机网络

一台机器理论上能创建多少条TCP连接&#xff1f; Linux每维护一条TCP连接都要花费内存资源的&#xff0c;每一条静止状态&#xff08;不发送数据和不接收数据&#xff09;的 TCP 连接大约需要吃 3.44K 的内存&#xff0c;那么 8 GB 物理内存的服务器&#xff0c;最大能支持的 …

Win11 安装docker 及 WSL2 并更新安装位置及迁移

1 下载并安装运行 Docker Desktop 1.1 下载 Docker Desktop 点击链接下载 Docker Desktop&#xff1a;https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe 下载后得到&#xff1a; 1.2 通过命令行安装 Docker Desktop 在 Docker Desktop Install…

【HDFS】DatanodeAdminBackoffMonitor退役节点极慢的问题定位

一、现象: 下节点特别慢。10台节点,每台大约需要退役60w个块。但是3个小时才退役了3000多个块。 NN侧如下日志,可以看到30秒只退役了512-494 = 20个块,这要是退役600w个块,得猴年马月? 2024-03-19 14:44:42,952 INFO org.apache.hadoop.hdfs.server.blockmanagement.D…

计算机系统基础 4 寻址方式

对于一条指令&#xff0c;我们重点关注它两点&#xff1a;执行什么样的操作&#xff0c;操作数在哪里。 操作数存放的位置即为存放地址&#xff0c;一般是CPU内寄存器、主存、或者I/O设备端口。当操作数在主存时&#xff0c;我们重点关注段址/段选择符、段内偏移。 寻找操作数存…

RuoYi-Vue若依框架-代码生成器的使用

代码生成器 导入表 在系统工具内找到代码生成&#xff0c;点击导入&#xff0c;会显示数据库内未被导入的数据库表单&#xff0c;选择自己需要生成代码的表&#xff0c;友情提醒&#xff0c;第一次使用最好先导入一张表进行试水~ 预览 操作成功后可以点击预览查看效果&…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

Linux系统磁盘管理

这里写目录标题 Linux系统磁盘管理磁盘容量检查磁盘分区fdisk分区gdisk分区 磁盘格式化磁盘挂载临时挂载磁盘永久挂载磁盘卸载挂载磁盘 交换分区SWAP创建swapfile格式化swap分区检测当前swap分区情况开启新建的SWAP分区关闭新建的swap分区 生产磁盘故障案例 Linux系统磁盘管理 …

【LeetCode热题100】108. 将有序数组转换为二叉搜索树

一.题目要求 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#x…

Python - epub2txt

文章目录 关于 epub2txt安装 命令行使用查看 options常见用法示例1 Python 代码调用manualabsl.app:absl.logging:epub2txt.__main__:absl.flags: 关于 epub2txt Convert epub file to txt github : https://github.com/ffreemt/epub2txt 安装 pip install epub2txt命令行使…

这个极其适合新手的Facebook聊单模式!必学!极度友好!

基于现在的网络流量来说&#xff0c;Facebook不仅仅是个人的社交圣地&#xff0c;更加是很多卖家的黄金市场&#xff0c;背后蕴藏着无限的商业潜力。对于刚刚踏入电商领域的新手而言&#xff0c;Facebook这个平台是个很好地展示产品、吸引客户&#xff0c;并实现销售的地方。 …

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话&#xff1a; 充满着欢乐与斗争精神的人们&#xff0c;永远带着欢乐&#xff0c;欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(&#xff65;ω&#xf…

WorkPlus AI助理,为企业提供智能化客户服务,助力企业发展与竞争力

在当今竞争激烈的商业环境中&#xff0c;提供优质高效的客户服务是企业取得成功的关键。而AI智能客服的崛起&#xff0c;以其卓越的性能和功能&#xff0c;助力企业提升客户服务体验。WorkPlus AI助理作为一款领先的解决方案&#xff0c;能够实现智能化客户服务&#xff0c;满足…

TTS通用播放库技术设计

TTS音频播放库技术设计 目录介绍 01.整体介绍概述 1.1 项目背景介绍1.2 遇到问题1.3 基础概念介绍1.4 设计目标1.5 问题答疑和思考 02.技术调研说明 2.1 语音播放方案2.2 TTS技术分析2.3 语音合成技术2.4 方案选择说明2.5 方案设计思路2.6 文本生成音频 03.系统TTS使用实践 3…

如何在CentOS7部署openGauss管理系统并实现固定公网地址连接

文章目录 推荐前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

抖音小店怎么做?起店流程大分享,可收藏!

大家好&#xff0c;我是电商糖果 会开店&#xff0c;但是不会起店。 这是不是很多电商商家遇到难题&#xff0c;尤其是刚开始做抖音小店的商家。 店开好几月也没有流量&#xff0c;不出单。 这里糖果就来分享一下&#xff0c;我这边自己总结的起店流程。 不敢自夸是最好的…

类和对象三部曲(one)

都说C语言是面向过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用来逐步解决问题。 拿洗衣服来举例&#xff0c;C关注的是一个过程&#xff1a; 那么C是什么呢&#xff1f; 面向对象的编程语言。 面向对象对象指什么&#xff1f; 象棋里的对象么&#xff1f;…

大模型时代5个最顶级的向量数据库

大家好&#xff0c;数字时代推动我们进入了由人工智能和机器学习为主导的时代&#xff0c;向量数据库已经成为存储、搜索和分析高维数据向量的不可或缺的工具&#xff0c;本文将介绍5个顶级的向量数据库。 1.Chroma 使用ChromaDB构建LLM应用程序 Chroma是开源嵌入数据库。Chr…

医疗行业对SDWAN专线的需求

随着信息技术的发展和医疗行业的数字化转型&#xff0c;SDWAN&#xff08;软件定义广域网&#xff09;作为一种新兴的网络解决方案&#xff0c;越来越受到医疗机构的重视和应用。医疗行业对SDWAN专线的需求主要体现在以下几个方面&#xff1a; 1、高度可靠的网络连接 医疗机构…