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

思路:双击发出信号,显示创建好的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

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值