Qt 容器类控件

本文介绍了如何在Qt中使用QGroupBox创建带标题的分组框,以及如何使用QTabWidget实现带有标签页的控件管理。通过实例展示了如何添加、删除标签页以及处理分组框的交互事件。
摘要由CSDN通过智能技术生成

Group Box

使用 QGroupBox 实现一个带有标题的分组框可以把其他的控件放到里面作为一组,这样看起来能更好看一点.

在这里插入图片描述

核心属性

属性说明
title分组框的标题
alignment分组框内部内容的对齐方式
flat是否是 “扁平” 模式
checkable是否可选择.
设为 true,则在 title 前方会多出一个可勾选的部分.
checked描述分组框的选择状态 (前提是 checkable 为 true)

分组框只是一个用来"美化界面"这样的组件,并不涉及到用户交互和业务逻辑.属于"锦上添花"

代码示例:给麦当劳案例加上分组框

(1) 在界面上创建三个分组框(Group Box),且在分组框内部创建下拉框(ComboBox)和微调框(SpinBox)

在这里插入图片描述

注意:在复制粘贴控件的时候, 一定要先选中对应的父控件, 再粘贴.

(2) 编写 widget.cpp,添加初始化下拉框的代码

Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
	ui->setupUi(this);
	ui->comboBox->addItem("巨⽆霸");
	ui->comboBox->addItem("⻨辣鸡腿堡");
	ui->comboBox_2->addItem("薯条");
	ui->comboBox_2->addItem("⻨辣鸡翅");
	ui->comboBox_3->addItem("可乐");
	ui->comboBox_3->addItem("雪碧");
}

(3) 运行程序, 观察效果

在这里插入图片描述

Tab Widget

使用 QTabwidget 实现一个带有标签页的控件,可以往里面添加一些 widget。进一步的就可以通过标签页来切换。

核心属性

属性说明
tabPosition标签页所在的位置
North:上方
South:下方
West:左侧
East:右侧
currentIndex当前选中了第几个标签页 (从 0 开始计算)
currentTabText当前选中的标签页的文本
currentTabName当前选中的标签页的名字
currentTabIcon当前选中的标签页的图标
currentTabToolTip当前选中的标签页的提示信息
tabsCloseable标签页是否可以关闭
movable标签页是否可以移动

核心信号

属性说明
currentChanged(int)在标签页发生切换时触发, 参数为被点击的选项卡编号.
tabBarClicked(int)在点击选项卡的标签条的时候触发. 参数为被点击的选项卡编号.
tabBarDoubleClicked(int)在双击选项卡的标签条的时候触发. 参数为被点击的选项卡编号
tabCloseRequest(int)在标签页关闭时触发. 参数为被关闭的选项卡编号

代码示例: 使用标签页管理多组控件

(1) 在界面上创建一个 QTabwidget,和两个按钮。按钮的 objectNamepushButton_addpushButton_remove

在这里插入图片描述

注意

  • QTabWidget 中的每个标签页都是一个 QWidget
  • 点击标签页, 就可以直接切换.
  • 右键 QTabWidget , 可以添加标签页或者删除标签页.

(2) 编写 widget.cpp,进行初始化,给标签页中放个简单的 label

注意新创建的 label 的父元素,是 ui->tab 和 ui->tab_2。Qt 中使用父子关系决定该控件“在哪里"

QLabel* label = new QLabel(ui->tab);
label->setText("标签页1");
label->resize(100, 50);
QLabel* label2 = new QLabel(ui->tab_2);
label2->setText("标签页2");
label2->resize(100, 50);

(3) 编写按钮的 slot 函数

  • 使用 count() 获取到标签页的个数.
  • 使用 addTab 新增标签页
  • 使用 removeTab 删除标签页
  • 使用 currentIndex 获取到当前标签页的下标.
  • 使用 setCurrentIndex 切换当前标签页
void Widget::on_pushButton_add_clicked()
{
	// 获取当前有⼏个标签⻚了
	int count = ui->tabWidget->count();
	// 创建新的 widget
	QWidget* w = new QWidget();
	ui->tabWidget->addTab(w, QString("Tab ") + QString::number(count + 1));
	// 给 widget 中添加 label
	QLabel* label = new QLabel(w);
	label->setText(QString("标签⻚") + QString::number(count + 1));
	label->resize(100, 50);
	// 选中这个新的标签⻚
	ui->tabWidget->setCurrentIndex(count);
}

void Widget::on_pushButton_remove_clicked()
{
	// 获取当前标签⻚的下标
	int index = ui->tabWidget->currentIndex();
	// 删除这个标签⻚
	ui->tabWidget->removeTab(index);
}

(4) 编写 QTabWidget 的 currentChanged 函数

void Widget::on_tabWidget_currentChanged(int index)
{
	qDebug() << "当前选中标签⻚为: " << index;
}

(5) 运行程序, 观察效果

  • 点击新建标签页, 可以创建出新的标签.
  • 点击删除当前标签页, 可以删除标签.
  • 切换标签页时, 可以看到 qDebug 打印出的标签页编号.

在这里插入图片描述

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,你可以使用拖放操作来将按钮(或其他控件)拖动到容器控件中。下面是一个简单的示例,展示如何实现这个功能: 1. 首先,在容器控件中,你需要启用拖放操作。这可以通过在构造函数中设置setAcceptDrops(true)来完成。 ```cpp ContainerWidget::ContainerWidget(QWidget *parent) : QWidget(parent) { setAcceptDrops(true); } ``` 2. 然后,在按钮(或其他控件)的中,你需要实现拖放事件。这包括mousePressEvent、mouseMoveEvent和drag事件。 ```cpp ButtonWidget::ButtonWidget(QWidget *parent) : QPushButton(parent) { // 设置按钮可拖动 setDragEnabled(true); } void ButtonWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 鼠标左键按下时,开始拖动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } void ButtonWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 鼠标左键按下并移动时,移动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } ``` 3. 最后,在容器控件中,你需要实现拖放事件。这包括dragEnterEvent和dropEvent。 ```cpp void ContainerWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void ContainerWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString buttonText = event->mimeData()->text(); ButtonWidget *button = new ButtonWidget(this); button->setText(buttonText); button->move(event->pos()); button->show(); event->acceptProposedAction(); } } ``` 现在,你可以创建一个容器控件和多个按钮控件,并将这些按钮拖动到容器控件中。按钮会在容器中显示,并且你可以随意移动它们。 希望这可以帮助到你!如果有任何进一步的问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值