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