QT界面:tabWidget选项卡使用小结

环境:Win10+VS2015+Qt5.9.7

首先创建一个Qt GUI Application,在GUI上拖拽一个tabWidget,对象名为tabWidget。系统会默认建立两个选项卡,如果不用可以先删除。
如图:
在这里插入图片描述
在资源文件中添加icon与图像资源:
在这里插入图片描述

tabWidget.h :
#pragma once

#include <QtWidgets/QMainWindow>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QCheckBox>
#include <QRadioButton>

#include "ui_tabWidget.h"

#pragma execution_character_set("utf-8")

class tabWidget : public QMainWindow
{
	Q_OBJECT

public:
	tabWidget(QWidget *parent = Q_NULLPTR);

private:
	Ui::tabWidgetClass ui;
};

在“采集”选项中添加一些按钮资源:

tabWidget.cpp :
#include "tabWidget.h"

tabWidget::tabWidget(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	QWidget *tabCalibration = new QWidget(this);
	QWidget *tabImage = new QWidget(this);

	ui.tabWidget->setTabPosition(QTabWidget::North);//设置选项卡的方位,默认在上方(东南西北)
	ui.tabWidget->addTab(tabCalibration, QIcon("Resources\\a10.ico"), tr("校准"));//在后面添加带图标的选项卡
	//ui.tabWidget->setIconSize(QSize(50, 25));//设置图标的大小(选项卡的大小也会改变)
	ui.tabWidget->addTab(tabImage, QIcon(QPixmap("Resources\\a11.png").scaled(150, 120)), NULL);//添加选项卡
	ui.tabWidget->setTabToolTip(1, tr("图像"));//鼠标悬停弹出提示
	ui.tabWidget->setTabShape(QTabWidget::Triangular);//设置选项卡的形状 Rounded	
	ui.tabWidget->setMovable(true);
	ui.tabWidget->usesScrollButtons();//选项卡滚动
	//ui->tabWidget->removeTab(0);//移除选项卡
	//ui->tabWidget->clear();//清空选项卡

	QHBoxLayout *hlayout1 = new QHBoxLayout;
	QRadioButton *continusModeRadioButton = new QRadioButton(tr("连续"));
	QRadioButton *triggerModeRadioButton = new QRadioButton(tr("触发"));
	hlayout1->addWidget(continusModeRadioButton);
	hlayout1->addWidget(triggerModeRadioButton);

	QHBoxLayout *hlayout2 = new QHBoxLayout;
	QPushButton *startGrabbingPushButton = new QPushButton(tr("开始"));
	QPushButton *stopGrabbingPushButton = new QPushButton(tr("停止"));
	hlayout2->addWidget(startGrabbingPushButton);
	hlayout2->addWidget(stopGrabbingPushButton);

	QHBoxLayout *hlayout3 = new QHBoxLayout;
	QCheckBox *softwareTriggerCheckBox = new QCheckBox(tr("选择"));
	QPushButton *softwareOncePushButton = new QPushButton(tr("终止"));
	hlayout3->addWidget(softwareTriggerCheckBox);
	hlayout3->addWidget(softwareOncePushButton);

	QHBoxLayout *hlayout4 = new QHBoxLayout;
	QCheckBox *detectionCheckBox = new QCheckBox(tr("检测"));
	hlayout4->addWidget(detectionCheckBox);

	QGridLayout *vlayout = new QGridLayout;
	vlayout->addLayout(hlayout1, 0, 0);
	vlayout->addLayout(hlayout2, 1, 0);
	vlayout->addLayout(hlayout3, 2, 0);
	vlayout->addLayout(hlayout4, 3, 0);

	QWidget *tabCollection = new QWidget;
	tabCollection->setLayout(vlayout);
	ui.tabWidget->insertTab(1, tabCollection, QIcon("Resources\\a12.ico"), tr("采集"));//插入选项卡
}

最后界面效果,如图:
在这里插入图片描述
在这里插入图片描述

这时,可以为选项卡中的控件资源添加槽函数:

tabWidget.h :
#pragma once

#include <QtWidgets/QMainWindow>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <QCheckBox>
#include <QRadioButton>
#include <QMessageBox>

#include "ui_tabWidget.h"

#pragma execution_character_set("utf-8")

class tabWidget : public QMainWindow
{
	Q_OBJECT

public:
	tabWidget(QWidget *parent = Q_NULLPTR);

private:
	Ui::tabWidgetClass ui;

	QPushButton *startGrabbingPushButton;
	QPushButton *stopGrabbingPushButton;

private slots:
	void runPushButtonSlot();

};

tabWidget.cpp :
#include "tabWidget.h"

tabWidget::tabWidget(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	QWidget *tabCalibration = new QWidget(this);
	QWidget *tabImage = new QWidget(this);

	ui.tabWidget->setTabPosition(QTabWidget::North);//设置选项卡的方位,默认在上方(东南西北)
	ui.tabWidget->addTab(tabCalibration, QIcon("Resources\\a10.ico"), tr("校准"));//在后面添加带图标的选项卡
	//ui.tabWidget->setIconSize(QSize(50, 25));//设置图标的大小(选项卡的大小也会改变)
	ui.tabWidget->addTab(tabImage, QIcon(QPixmap("Resources\\a11.png").scaled(150, 120)), NULL);//添加选项卡
	ui.tabWidget->setTabToolTip(1, tr("图像"));//鼠标悬停弹出提示
	ui.tabWidget->setTabShape(QTabWidget::Triangular);//设置选项卡的形状 Rounded	
	ui.tabWidget->setMovable(true);
	ui.tabWidget->usesScrollButtons();//选项卡滚动
	//ui->tabWidget->removeTab(0);//移除选项卡
	//ui->tabWidget->clear();//清空选项卡

	QHBoxLayout *hlayout1 = new QHBoxLayout;
	QRadioButton *continusModeRadioButton = new QRadioButton(tr("连续"));
	QRadioButton *triggerModeRadioButton = new QRadioButton(tr("触发"));
	hlayout1->addWidget(continusModeRadioButton);
	hlayout1->addWidget(triggerModeRadioButton);

	QHBoxLayout *hlayout2 = new QHBoxLayout;
	startGrabbingPushButton = new QPushButton(tr("开始"));
	startGrabbingPushButton->setStyleSheet("background-color: rgb(0, 255, 127);");
	QObject::connect(startGrabbingPushButton, SIGNAL(clicked()), this, SLOT(runPushButtonSlot()));
	stopGrabbingPushButton = new QPushButton(tr("停止"));

	hlayout2->addWidget(startGrabbingPushButton);
	hlayout2->addWidget(stopGrabbingPushButton);

	QHBoxLayout *hlayout3 = new QHBoxLayout;
	QCheckBox *softwareTriggerCheckBox = new QCheckBox(tr("选择"));
	QPushButton *softwareOncePushButton = new QPushButton(tr("终止"));
	hlayout3->addWidget(softwareTriggerCheckBox);
	hlayout3->addWidget(softwareOncePushButton);

	QHBoxLayout *hlayout4 = new QHBoxLayout;
	QCheckBox *detectionCheckBox = new QCheckBox(tr("检测"));
	hlayout4->addWidget(detectionCheckBox);

	QGridLayout *vlayout = new QGridLayout;
	vlayout->addLayout(hlayout1, 0, 0);
	vlayout->addLayout(hlayout2, 1, 0);
	vlayout->addLayout(hlayout3, 2, 0);
	vlayout->addLayout(hlayout4, 3, 0);

	QWidget *tabCollection = new QWidget;
	tabCollection->setLayout(vlayout);
	ui.tabWidget->insertTab(1, tabCollection, QIcon("Resources\\a12.ico"), tr("采集"));//插入选项卡
}

void tabWidget::runPushButtonSlot()
{
	qDebug() << "第1个选项卡名称:" << ui.tabWidget->tabText(0);
	QMessageBox::information(this, "第1个选项卡名称:", ui.tabWidget->tabText(0));//获取选项卡名称
	startGrabbingPushButton->setStyleSheet("background-color: rgb(255, 100, 100);");
}

在这里插入图片描述

在这里插入图片描述

  • 15
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用QTabBar的setMovable()函数将TabWidget设置为可拖拽,然后在TabBar上设置鼠标事件,当鼠标按下时,记录下当前Tab的位置和大小,创建一个新的窗口并将Tab上的控件移动到新窗口中,同时设置新窗口的标题为当前Tab的标题。当双击新窗口的标题栏时,将窗口中的控件移动回原来的Tab中,同时关闭该窗口。以下是示例代码: ```cpp void MyTabWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_dragStartPosition = event->pos(); } } void MyTabWidget::mouseMoveEvent(QMouseEvent *event) { if (!(event->buttons() & Qt::LeftButton)) return; if ((event->pos() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance()) return; int index = currentIndex(); if (index < 0) return; QWidget *widget = widget(index); if (!widget) return; QMimeData *mimeData = new QMimeData; QByteArray widgetData; QDataStream dataStream(&widgetData, QIODevice::WriteOnly); dataStream << QPoint(event->pos() - widget->pos()); dataStream << widget->size(); mimeData->setData("application/x-dnditemdata", widgetData); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(*widget->grab()); drag->setHotSpot(event->pos() - widget->pos()); if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) { widget->close(); } } void MyTabWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasFormat("application/x-dnditemdata")) { if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->acceptProposedAction(); } } else { event->ignore(); } } void MyTabWidget::dragMoveEvent(QDragMoveEvent *event) { if (event->mimeData()->hasFormat("application/x-dnditemdata")) { if (event->source() == this) { event->setDropAction(Qt::MoveAction); event->accept(); } else { event->acceptProposedAction(); } } else { event->ignore(); } } void MyTabWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("application/x-dnditemdata")) { QByteArray widgetData = event->mimeData()->data("application/x-dnditemdata"); QDataStream dataStream(&widgetData, QIODevice::ReadOnly); QPoint offset; QSize size; dataStream >> offset >> size; QWidget *widget = new QWidget(this); widget->setGeometry(QRect(event->pos() - offset, size)); widget->show(); event->setDropAction(Qt::MoveAction); event->accept(); } else { event->ignore(); } } void MyTabWidget::tabCloseRequested(int index) { QWidget *widget = this->widget(index); if (widget) { widget->close(); } } void MyTabWidget::tabDoubleClick(int index) { QWidget *widget = this->widget(index); if (widget) { widget->setParent(this); widget->show(); setCurrentIndex(index); } } ``` 其中,MyTabWidget继承自QTabWidget,重载了鼠标事件和Tab关闭事件。在鼠标事件中,记录下当前Tab的位置和大小,并创建一个新的窗口并将Tab上的控件移动到新窗口中。在Tab关闭事件中,关闭窗口并将控件移动回原来的Tab中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值