Qt-窗口布局按钮输入类

1. 窗口布局

  • Qt 提供了很多摆放控件的辅助工具(又称布局管理器或者布局控件),它们可以完成两件事:

    • 自动调整控件的位置,包括控件之间的间距、对齐等;

    • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观。

  • Qt 共提供了4种布局管理器:

    • QVBoxLayout(垂直布局)

    • QHBoxLayout(水平布局)

    • QGridLayout(网格布局、栅格布局、棋盘布局)

    • QFormLayout(表单布局)

1.1 垂直和水平布局

 

常用函数:

  • layout -> addWidget(QWidget) : 向布局中添加部件

  • layout -> setSpacing(int) : 设置部件之间的距离

  • layout -> setDirection(QBoxLayout::LeftToRight) : 设置部件排列顺序

    • QBoxLayout::LeftToRight

    • QBoxLayout::RightToLeft

    • QBoxLayout::TopToBottom

    • QBoxLayout::BottomToTop

QPushButton *btn1 = new QPushButton("btn1");
QPushButton *btn2 = new QPushButton("btn2");
QPushButton *btn3 = new QPushButton("btn3");ui->hl2->addWidget(btn1);
ui->hl2->addWidget(btn2);
ui->hl2->addWidget(btn3);
ui->hl2->setSpacing(30);
ui->hl2->setDirection(QBoxLayout::RightToLeft);

1.2 网格布局

对整个窗体进行布局有: 水平布局、垂直布局、栅格布局 三种。

栅格布局的特点:

  • 随着窗口大小的改变,里面的部件也会随之改变

  • 栅格布局中也能嵌套水平布局和垂直布局

动态调整部件的宽高  

1.3 表单布局

2. 按钮类

2.1 QPushButton

  • 常用按钮:可以设置成文字按钮、图片按钮、带下拉菜单的按钮

  • 设置成带下拉菜单按钮时需要配合 QMenu

// 一般按钮
ui->qBtn1->resize(80, 40);// 图片按钮
ui->qBtn2->resize(80, 40);
ui->qBtn2->setIcon(QIcon(":/images/ashe.jpg"));
ui->qBtn2->setIconSize(QSize(32, 32));// 图文按钮
ui->qBtn3->resize(80, 40);
ui->qBtn3->setText("狗头");// 下拉菜单按钮
ui->qBtn4->setText("选择学历");
ui->qBtn4->resize(80, 40);// 下拉菜单
QMenu *degree = new QMenu;
degree->addAction("博士");
degree->addAction("硕士");
degree->addAction("本科");
degree->addAction("大专");
degree->addAction("高中");// 将下拉菜单添加到按钮中
ui->qBtn4->setMenu(degree);

2.2 QToolButton

工具按钮:一般用于制作纯图按钮。 也可以设置成文字按钮 和 图片文字同时都有的按钮。如下图:

  • toolButtonStyle:图片和文字排列方式

  • autoRaise:按钮透明

ui->toolBtn1->setText("一般按钮");
ui->toolBtn1->resize(80, 40);
ui->toolBtn1->move(30, 80);ui->toolBtn2->resize(80, 40);
ui->toolBtn2->move(130, 80);
ui->toolBtn2->setIconSize(QSize(60, 60));
ui->toolBtn2->setIcon(QIcon(":/images/jinx.jpg"));// 图文按钮
ui->toolBtn3->setText("狗头");
ui->toolBtn3->resize(80, 40);
ui->toolBtn3->move(230, 80);
ui->toolBtn3->setIcon(QIcon(":/images/goutou.jpg"));
// 设置图片和文字的排列方式
ui->toolBtn3->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
// 设置是否取消边框
ui->toolBtn3->setAutoRaise(true);

2.3 Radio(单选框)

  • QRadioButton: 单选框

  • 若干个单选框需要设置为一个组才能实现单选效果

    • QHBoxLayout 使用水平布局进行分组

    • QGroup

// 单选框 -- 性别
connect(ui->male, &QRadioButton::clicked, [=](){gender = 1;
});
connect(ui->female, &QRadioButton::clicked, [=](){gender = 0;
});
connect(ui->unknown, &QRadioButton::clicked, [=](){gender = 2;
});
// 单选框 -- 学位
void Widget::on_r1_clicked()
{degreeStr = ui->r1->text();qDebug() << degreeStr;
}void Widget::on_r2_clicked()
{degreeStr = ui->r2->text();qDebug() << degreeStr;
}void Widget::on_r3_clicked()
{degreeStr = ui->r3->text();qDebug() << degreeStr;
}void Widget::on_r4_clicked()
{degreeStr = ui->r4->text();qDebug() << degreeStr;
}

2.4 checkbox(复选框)

QCheckBox 类

  • 信号: stateChanged 当选择状态改变时触发

  • 注意事项: 复选框也需要使用 水平|垂直布局 或者 QGroup 归为一组

  • 复选框的半选状态

// 复选框
connect(ui->eatCheck, &QCheckBox::stateChanged, [=](){if(ui->eatCheck->isChecked()){hobbies.append("吃");}else{hobbies.removeAt(hobbies.indexOf("吃"));}qDebug() << hobbies;
});connect(ui->drinkCheck, &QCheckBox::stateChanged, [=](){if(ui->drinkCheck->isChecked()){hobbies.append("喝");}else{hobbies.removeAt(hobbies.indexOf("喝"));}qDebug() << hobbies;
});connect(ui->playCheck, &QCheckBox::stateChanged, [=](){if(ui->playCheck->isChecked()){hobbies.append("玩");}else{hobbies.removeAt(hobbies.indexOf("玩"));}qDebug() << hobbies;
});connect(ui->happyCheck, &QCheckBox::stateChanged, [=](){if(ui->happyCheck->isChecked()){hobbies.append("乐");}else{hobbies.removeAt(hobbies.indexOf("乐"));}qDebug() << hobbies;
});

复选框的半选状态:

QCheckBox *c = new QCheckBox("半选", this);
c->setCheckState(Qt::PartiallyChecked);
c->move(320, 300);
connect(c, &QCheckBox::stateChanged, [=](){qDebug() << c->checkState();
});

2.5 按钮组

QButtonGroup 用来创建一个按钮组,内部可以包含多个按钮。

方法:

  • addButton(*btn, index) : 向按钮组中添加按钮。

    • 参数1 : 添加到按钮组中的按钮;

    • 参数2 : 添加到组中的索引号

信号:

  • buttonClicked(int index) : 点击按钮组中的按钮时触发,参数 int 保存点击的按钮的需要

class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();public slots:void btnGroupSlot(int index);private:Ui::Widget *ui;
};
// 创建按钮组
QButtonGroup *btnGroup = new QButtonGroup(this);// 向按钮组中添加按钮
btnGroup->addButton(ui->maleBtn, 0);
btnGroup->addButton(ui->femaleBtn, 1);
btnGroup->addButton(ui->unkownBtn, 2);// 链接按钮组的信号和槽函数
connect(btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(btnGroupSlot(int)));
void Widget::btnGroupSlot(int index)
{switch (index){case 0:qDebug() << "男";break;case 1:qDebug() << "女";break;case 2:qDebug() << "未知";break;}
}

3. 输入类

3.1 QComboBox

QComboBox 用来设置下拉菜单

1.图形化设置

2)重要信号:

currentIndexChanged(int index) : 当选项发生改变时触发该信号,获取选中的索引号

void Widget::on_addrComBox_currentIndexChanged(int index)
{qDebug() << index;
}

3)常用方法:

  • addItem(QIcon, QString); 向下拉菜单中添加选项, QIcon 是可选参数

  • setCurrentIndex(index); 设置默认选中项

// 添加选项
ui->addrComBox->addItem("成都");
ui->addrComBox->addItem("重庆");// 设置默认选中项
ui->addrComBox->setCurrentIndex(1);

案例: 批量向下拉菜单中添加数据,当选中某个选项时向控制台输出选中项数据

1) 头文件中声明数据类型 和 槽函数

// 头文件// 声明数据结构
struct HeroStruct
{int heroId;QString heroName;QString heroIcon;
};class Widget : public QWidget
{......private slots:// 槽函数void on_heroComboBox_currentIndexChanged(int index);private:Ui::Widget *ui;// 数据变量声明QList<HeroStruct> heroList;
};
heroList = {{1, "金克斯", ":/images/jinx.jpg"},{3, "琴女", ":/images/qinnv.jpeg"},{7, "亚索", ":/images/yasuo.jpeg"}
};// 循环添加
for(int i = 0; i < heroList.size(); i++)
{ui->heroComboBox->addItem(QIcon(heroList[i].heroIcon), heroList[i].heroName);
}
void Widget::on_heroComboBox_currentIndexChanged(int index)
{qDebug() << index << heroList[index].heroId << heroList[index].heroName;
}

3.2 QFontComboBox

QFontComboBox 是字体选择器,继承于 QComboBox

常用信号:

currentFontChanged(const QFont &font) : 选中字体发生改变时触发

void Widget::on_fontComboBox_currentFontChanged(const QFont &f)
{qDebug() << f.family();
}

 常用方法:

ui->fontComboBox->setCurrentFont(QFont("楷体"));

3.3 数字框

  • QSpinBox : 整型数字框

  • QDoubleSpinBox : 浮点型数字框

常用方法:

  • setMinimum(int) : 设置最小值

  • setMaximum(int) :设置最大值

  • setValue(int) : 设置当前值

  • setPrefix(QString) : 设置前缀

  • setSuffix(QString) : 设置后缀

  • setSingleStep(int) : 设置步进值

信号: 当值发生改变时触发

  • valueChanged(const QString &arg1)

  • valueChanged(int arg1)

图形化设置:

3.4 时间和日期

  • QDateTimeEdit :日期时间

  • QTimeEdit : 时间框 (继承于 QDateTimeEdit)

  • QDateEdit : 日期框 (继承于 QDateTimeEdit)

常用方法:

QDateTimeEdit(QDateTime) : 构造函数

dateTimeEdit(QDateTime) : 设置日期时间

setDisplayFormat(format) :设置日期格式

setCalendarPopup(bool) : 弹出日期选择器

QDateTime d = QDateTime::currentDateTime();
ui->dateTimeEdit->setDateTime(d);
// 利用构造函数
QDateTimeEdit *dt = new QDateTimeEdit(QDateTime(QDate(2023,10,10), QTime(9,10,20)), this);dt->setDisplayFormat("yyyy-MM-dd HH:mm:ss");
dt->move(242, 110);

图形化设置:

3.5 QSlider

QSlider 滑动条

常用方法:

  • QSlider(水平|垂直, this);

    • Qt::Horizontal

  • setValue(int) : 设置当前值

  • setRange(min, max) : 设置值范围

  • setMinimum(int) / setMaximum(int) : 设置最小值和最大值

  • setTickPosition() : 设置是否是否有刻度

    • QSlider::NoTicks //不显示刻度

    • QSlider::TicksBothSides //标尺两侧都显示刻度

    • QSlider::TicksAbove //标尺上方显示刻度

    • QSlider::TicksBelow //标尺下方显示刻度

    • QSlider::TicksLeft //标尺左侧显示刻度

    • QSlider::TicksRight //标尺右侧显示刻度

  • setTickInterval(int) : 刻度间隔

QSlider *hs = new QSlider(Qt::Horizontal, this);
hs->resize(200, 20);
hs->move(30, 170);
hs->setRange(0, 200);
hs->setTickPosition(QSlider::TicksBelow);
hs->setTickInterval(50);

 图形化

信号: 拖动滚动条时触发

valueChanged(int value)

void Widget::on_hSlider_valueChanged(int value)
{qDebug() << value;
}

 

 

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

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

相关文章

AI没有是非观的原因

人工智能没有价值观的原因主要可以归结为只有数据驱动的被动性相关算法&#xff0c;没有主动干预性及其反事实关系&#xff1a; &#xff08;1&#xff09;数据被动驱动 AI的学习、分析、预测只依赖于大量的数据&#xff0c;并通过模式识别和统计分析建立关联。而这些数据本身可…

【算法】链表:2.两数相加(medium)+模拟

系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法 (模拟) 4、代码 1、题目链接 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 2、题目介绍 3、解法 (模拟) 理解题目要求&#xff1a; 我们有两个链表&#xff0c;每个链表代表一个…

51单片机-第十四节-AD/DA(XPT2046触摸屏)

一、AD/DA介绍&#xff1a; AD&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号。 DA&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号。 二、运算放大器&#xff1a; 1.介绍&#xff1a; &#xff08;1&#xf…

给网站加加速!下一代CDN(EdgeOne/边缘安全加速)使用与配置体验

随着访问量的增加和用户需求的多样化&#xff0c;服务器的带宽有限&#xff0c;面对一些图片数据&#xff0c;显得“力不从心”。CDN技术&#xff0c;就很好的解决了这个问题&#xff0c;但是价格也是用户思考的问题。 EdgeOne不仅继承了传统CDN的核心优势&#xff0c;更在速度…

uni-app 开发的应用快速构建成鸿蒙原生应用

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;它支持编译到 iOS、Android、小程序等多个平台。对于 HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;uni-app 提供了特定的支持&#xff0c;允许开发者构建鸿蒙原生应用。 一、uni-app 对 HarmonyOS 的支…

【用户管理 添加用户 超级用户 用户和组】

用户管理 添加用户超级用户用户和组 添加用户 介绍用户的管理操作 比如&#xff0c;添加一个用户 sudo useradd -m test1 其中&#xff0c;sudo表示管理员身份运行 修改用户密码 sudo passwd test1 删除用户 sudo userdel test 超级用户 1.首次使用时&#xff0c;需要给roo…

以光塑形:光固化3D打印机原理图文解析

公众号端&#xff1a; 光固化打印机介绍https://mp.weixin.qq.com/s?__bizMzkwMjc0MTE3Mw&mid2247484073&idx1&sn0d0fd026b373b06cd7c340ec8f56a006&chksmc0a1af73f7d62665a632baebbde4e5e00ffb9c6bd31bf547b4a86855d5524535619a6175a428#rd 光固化打印机…

IDEA上Mybatis介绍和使用

MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。 创建项目 在springboot项目中添加Mybatis和MySQL依赖项。 找到数据库选项&#xff0c;点击新建 -> 数据库源&#xff0c;选择MySQL。 输入完成信息后&#xff0c;可以先进行测试&#xff0c;可以成功连接再…

逻辑回归LogisticRegression

一、逻辑回归的基础介绍 逻辑回归是一个分类模型 它可以用来预测某件事发生是否能够发生。分类问题是生活中最常见的问题&#xff1a; 生活中&#xff1a;比如预测上证指数明天是否会上涨&#xff0c;明天某个地区是否会下雨&#xff0c;西瓜是否熟了 金融领域&#xff1a;…

p20 docker自己commit一个镜像 p21 容器数据卷 p22mysql同步数据(国内镜像被封锁暂时往后放)p23具名挂载和匿名挂载

如何自己commit一个镜像 这里还是先引用一下老师的笔记 关于如何自己commit一个镜像这个问题目前因为从仓库中拉下来的Tomcat里面是没有项目的&#xff0c;所以把webapps.dist里面的拷贝到webapps里面去作为自己的镜像在commit一下 这里用Tomcat举例子首先把镜像拉取下来执…

MySql数据库---存储过程

存储过程概念 MySQL 5.0 版本开始支持存储过程。 简单的说&#xff0c;存储过程就是一组SQL语句集&#xff0c;功能强大&#xff0c;可以实现一些比较复杂的逻辑功能&#xff0c;类似于JAVA语言中的方法&#xff0c;类似Python中的函数&#xff1b; 存储过就是数据库 SQL 语言…

多项目管理怎么进行❓看这篇就够了

多项目管理是一个复杂而细致的过程&#xff0c;涉及多个项目的同时进行和协调。首先&#xff0c;明确每个项目的目标和范围至关重要。在项目开始之初&#xff0c;应对所有项目进行全面评估&#xff0c;确定其战略价值、影响范围和资源需求。这有助于为每个项目设定清晰的优先级…

反应香精市场报告:预计2030年全球市场规模将达到264.3亿美元

“反应香精”通常是指通过在食品或饮料加工过程中发生的物理、化学或酶反应而产生的风味剂。可以有意添加这些香料以增强最终产品的味道、香气或其他感官方面。它们通常用于食品和饮料行业&#xff0c;以保持一致性、提高适口性或创造独特的风味特征。生产工艺香料的方法有多种…

新网站做谷歌SEO为什么短期内很难看到显著效果?

对于一个全新的网站来说&#xff0c;SEO的效果往往不会在短期内显现。这是因为SEO需要时间来积累权重和信任度。谷歌对新网站通常会有一个观察期&#xff0c;在这段时间内&#xff0c;网站的表现不稳定&#xff0c;排名也会波动较大&#xff0c;这是正常情况&#xff0c;这时候…

excel表格转换为在线成绩查询怎么制作?

在当前“双减”政策的背景下&#xff0c;学生的考试成绩不再被公开展示&#xff0c;这是对学生隐私的一种保护。然而&#xff0c;这同时也带来了一个新的问题&#xff1a;家长们对于孩子成绩的关切并未减少&#xff0c;他们依然迫切想要了解孩子的学习情况。以往&#xff0c;成…

使用Provide和Inject设计Vue3插件

使用provide和inject的Vue依赖项注入非常适合构建Vue3插件或避免prop多层传递。 尽管不经常使用它&#xff0c;但是您可以仅使用两个内置方法来实现依赖项注入&#xff1a;provide和inject。 查看Composition API文档&#xff0c;在Vue 3.0中&#xff0c;使用Provide和Inject进…

深度学习:循环神经网络—RNN的原理

传统神经网络存在的问题&#xff1f; 无法训练出具有顺序的数据。模型搭建时没有考虑数据上下之间的关系。 RNN神经网络 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络。在处理序列输入时具有记忆性…

基于RSSI原理的蓝牙定位程序(matlab代码,3维空间、基站数量>3即可,可自适应)

目录 商品描述 商品描述 这款基于接收信号强度指示&#xff08;RSSI&#xff09;原理的蓝牙定位程序&#xff0c;专为需要高效、可靠定位解决方案的开发者和研究人员设计。无论是在室内环境还是复杂的三维空间&#xff0c;该程序都能通过N个蓝牙锚点&#xff0c;实现对未知点的…

20.安卓逆向-frida基础-hook分析调试技巧2-hookDES

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

【在Linux世界中追寻伟大的One Piece】DNS与ICMP

目录 1 -> DNS(Domain Name System) 1.1 -> DNS背景 2 -> 域名简介 2.1 -> 域名解析过程 3 -> 使用dig工具分析DNS 4 -> ICMP协议 4.1 -> ICMP功能 4.2 -> ICMP报文格式 4.3 -> Ping命令 4.4 -> traceroute命令 1 -> DNS(Domain Na…