qt QTabWidget双击选项卡修改选项卡名字

本文介绍如何使用Qt的QTabWidget组件实现自定义选项卡名称功能,通过双击选项卡触发信号,显示QLineEdit输入框供用户输入新的选项卡名称,完成输入后更新选项卡显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:双击发出信号,显示创建好的QLineEdit输入名字,输入完成发出信号,获取QLineEdit的字符给选项卡改名字。由于不想重写QTabWidget,所以主要问题是如何确定QLineEdit的位置。

mainwindow.cpp


#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->resize(1280,800);
    documentTabs = new QTabWidget();//widget页表
    documentTabs->setTabsClosable(true);//设置有关闭按钮
    documentTabs->setMovable(true);//可拖动
    connect(documentTabs,SIGNAL(tabCloseRequested(int)),this,SLOT(closeTabWidSlot(int)));//关闭选项卡信号
    connect(documentTabs,SIGNAL(tabBarDoubleClicked(int)),this,SLOT(setTabName(int)));//双击选项卡信号

    this->setCentralWidget(documentTabs);   //添加进中心页面

    QToolButton *addTabWidgetBt = new QToolButton(this);//新建页面的Button
    addTabWidgetBt->setText("+");
    addTabWidgetBt->show();
    documentTabs->setCornerWidget(addTabWidgetBt,Qt::TopLeftCorner);        //添加到选项卡栏里
    connect(addTabWidgetBt, SIGNAL(clicked(bool)), this ,SLOT(MyaddTabWidgetSloat()));

    TabName = new QLineEdit(this);   //添加输入框
    TabName->hide();            //隐藏
    TabName->setToolTip("输入工作表名字");
    connect(TabName,SIGNAL(editingFinished()),this,SLOT(getTabName()));     //输入完成
    connect(TabName,SIGNAL(returnPressed()),this,SLOT(getTabName()));

    for(int i = 0; i<5;i++)     //创建五个页面
    {
        MyaddTabWidgetSloat();
    }
}

MainWindow::~MainWindow()
{

}

void MainWindow::MyaddTabWidgetSloat()      //新建选项卡
{
    QScrollArea *scrollArea = new QScrollArea();   //新建一个滚动区域
    QWidget *tab = new QWidget();
    tab->resize(documentTabs->width(),documentTabs->height());

    scrollArea->setWidget(tab);    //添加表格窗口到滚动区域
    scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);   //隐藏横向滚动条

    documentTabs->addTab(scrollArea,tr("newtext"));
    documentTabs->setCurrentWidget(scrollArea); //添加页面

}

void MainWindow::closeTabWidSlot(int i)         //关闭选项卡
{
    if(documentTabs->count() == 1)  //判断选显卡数量,不能少于1
    {
        QMessageBox *msgBox = new QMessageBox(QMessageBox::Warning,"提示","工作表不能少于一个,想要删除该工作表可以先新建一个工作表。",QMessageBox::Yes,this);
        msgBox->show();
    }else
    {
        QScrollArea * Area = qobject_cast<QScrollArea*>(documentTabs->widget(i)); //获取索引位置选项卡的滚动区域,将其删除
        documentTabs->removeTab(i);
        delete Area;
    }
}

void MainWindow::setTabName(int id)           //设置选项卡的名字
{
    TabName->show();
    TabName->setText(tr("%1").arg(documentTabs->tabBar()->tabText(id)));    //写入选项卡当前的名字

    TabName->resize(documentTabs->tabBar()->tabRect(id).size());    //获取QTabBar再获取他的矩形大小,用于设置输入框大小,Rect信息是相对于选项卡栏来算的
    TabName->move(documentTabs->x()+documentTabs->tabBar()->tabRect(id).x()+25,documentTabs->y());//设置输入框位置25为创建页面大小的宽
    TabName->setFocus();        //设置焦点
    TabName->selectAll();       //字符全选
    Temp_TabId = id;            //记录id,没想到好的办法,就干脆用个全局了
}

void MainWindow::getTabName()           //输入完毕从输入框获取输入的字符设置选项卡名字
{
    QString name = TabName->text();
    if(Temp_TabId != -1)
    {
        documentTabs->setTabText(Temp_TabId,name);
        Temp_TabId = -1;
    }
    TabName->hide();
}




mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QTabWidget>
#include <QTabBar>
#include <QToolButton>
#include <QScrollArea>
#include <QMessageBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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


    QTabWidget *documentTabs;//多页编解窗口
    QLineEdit *TabName;     //选项卡名输入框
    int Temp_TabId = -1;

public slots:
    void MyaddTabWidgetSloat();  //添加页面
    void closeTabWidSlot(int i);//关闭选项卡
    void setTabName(int id);    //设置选项卡的名字
    void getTabName();         //输入框中获取选项卡的名字

};

#endif // MAINWINDOW_H

可以使用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中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值