QTabWidget 重命名tabText

#QTabWidget 重命名tabText
通过双击Tab页,修改Tab页显示的文字,可以通过重写QTabBar的鼠标的双击事件实现,就需要子类化QTabBar。由于QTabWidget里的setTabBar是受保护的,所以QTabWidget也需要重写。
edittabbar.h

#ifndef EDITBAR_H
#define EDITBAR_H

#include <QWidget>
#include <QTabBar>
#include <QLineEdit>
#include <QMouseEvent>


class EditTabBar : public QTabBar
{
	Q_OBJECT
public:
	EditTabBar(QWidget* parent = 0);
	~EditTabBar();
	void mouseDoubleClickEvent(QMouseEvent *e);
	public slots:
	void renameLabel();
signals:
	void tabarTextChg(int index, QString str);
private:
	QLineEdit* m_lineEdit;
	int m_editedTabIndex;
};


#endif // EDITBAR_H

重写鼠标双击事件,通过QLineEdit实现tabText文字编辑,编辑完成后调用setTabText 修改tab标题。注意,此时需要隐藏QLineEdit。并发出信号告诉外界tab页标题变化,供外部使用。
edittabbar.cpp

#include "EditTabBar.h"


EditTabBar::EditTabBar(QWidget* parent)
:QTabBar(parent)
{
	m_lineEdit = new QLineEdit(this);
	m_lineEdit->hide();
	connect(m_lineEdit, SIGNAL(editingFinished()),
		this, SLOT(renameLabel()));
}

EditTabBar::~EditTabBar()
{

}

void EditTabBar::mouseDoubleClickEvent(QMouseEvent *e)
{
	if (e->button () != Qt::LeftButton) 
	{
		QTabBar::mouseDoubleClickEvent (e);
		return;
	}
	m_editedTabIndex = currentIndex ();
	m_lineEdit->setText(tabText(m_editedTabIndex));     
	m_lineEdit->setGeometry(tabRect(m_editedTabIndex));
	m_lineEdit->show();
}

void EditTabBar::renameLabel()
{
	setTabText (m_editedTabIndex, m_lineEdit->text());
	m_lineEdit->hide();
	emit tabarTextChg(m_editedTabIndex, m_lineEdit->text());
}

qtabwidget.h

#ifndef EDITTABWIDGET_H
#define EDITTABWIDGET_H

#include <QTabWidget>
class EditTabBar;
class EditTabWidget : public QTabWidget
{
	Q_OBJECT
public:
	EditTabWidget(QWidget* parent = 0);
	~EditTabWidget();
signals:
	void tabTextChg(int index, QString str);
private:
	EditTabBar* tabBar;
};

#endif // EDITTABWIDGET_H

qtabwidget.cpp
负责使用editbar,并加了tabTextChg(int index, QString str)向外传递tab页标题变化。

#include "EditTabBar.h"
#include "EditTabWidget.h"

EditTabWidget::EditTabWidget(QWidget* parent)
:QTabWidget(parent)
{
	tabBar = new EditTabBar(this);
	setTabBar(tabBar);
	connect(tabBar, SIGNAL(tabarTextChg(int, QString)),
		this, SIGNAL(tabTextChg(int, QString)));
}

EditTabWidget::~EditTabWidget()
{

}

edtitabtest.h

#ifndef EDITTABTEST_H
#define EDITTABTEST_H

#include <QtGui/QMainWindow>
#include <QScopedPointer>
class EditTabTest : public QMainWindow
{
	Q_OBJECT

public:
	EditTabTest(QWidget *parent = 0, Qt::WFlags flags = 0);
	~EditTabTest();
	QSize sizeHint() const
	{
		return QSize(400,300);
	}
public slots:
	void slot_StateNameChg(int index, QString str);
private:
	class Impl;
	QScopedPointer<Impl> m_Impl;
};

#endif // EDITTABTEST_H

edittabtest.cpp

#include "edittabtest.h"
#include "EditTabBar.h"
#include "EditTabWidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>

class EditTabTest::Impl
{
public:
	Impl()
	{

	}
	QWidget *centralWidget;
	EditTabWidget*	editTabWidget;
	QWidget* tab1;
	QWidget* tab2;
	void setupUi(EditTabTest* parent);
	void initWidget(EditTabTest* parent);
	void retranslateUi(EditTabTest* parent);
};

void EditTabTest::Impl::setupUi(EditTabTest* parent)
{
	centralWidget = new QWidget(parent);
	QVBoxLayout* vlMain = new QVBoxLayout(centralWidget);

	editTabWidget = new EditTabWidget(parent);
	tab1 = new QWidget();
	tab2 = new QWidget();
	editTabWidget->addTab(tab1, QString());
	editTabWidget->addTab(tab2, QString());
	vlMain->addWidget(editTabWidget);

    parent->setCentralWidget(centralWidget);

	initWidget(parent);
	retranslateUi(parent);
}

void EditTabTest::Impl::initWidget(EditTabTest* parent)
{
	connect(editTabWidget, SIGNAL(tabTextChg(int, QString)),
		parent, SLOT(slot_StateNameChg(int, QString)));
	
}

void EditTabTest::Impl::retranslateUi(EditTabTest* parent)
{
	editTabWidget->setTabText(0, tr("测试页1"));
	editTabWidget->setTabText(1, tr("测试页2"));
}

EditTabTest::EditTabTest(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
	, m_Impl(new Impl)
{
	m_Impl->setupUi(this);
}

EditTabTest::~EditTabTest()
{

}

void EditTabTest::slot_StateNameChg(int index, QString str)
{
	qDebug() << index << str;
}

main.cpp

#include "edittabtest.h"
#include <QtGui/QApplication>
#include <QTextCodec>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//设置中文编码
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
	QTextCodec *codec = QTextCodec::codecForName("GBK");
#else
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
#endif
	QTextCodec::setCodecForLocale(codec);
	QTextCodec::setCodecForCStrings(codec);
	QTextCodec::setCodecForTr(codec);
#else
	QTextCodec *codec = QTextCodec::codecForName("UTF-8");
	QTextCodec::setCodecForLocale(codec);
#endif

	EditTabTest w;
	w.show();
	return a.exec();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值