#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();
}