我在Visual Studio 2010和Qt中使用C ++;
一切都是通过代码完成的。我无法访问Qt Designer。
我的问题是:
我正在开发一个开源软件,知道" EasyPaint"。 我正在尝试实现一个选项卡重命名(当用户双击选项卡时,他可以在运行时重命名)
为此,我使用了eventFilter:
bool MainWindow::eventFilter(QObject *obj, QEvent *event){
if (obj == mTabWidget &&
event->type() == QEvent::MouseButtonDblClick) {
// query and set tab(s) names
QTabWidget *tab = qobject_cast<QTabWidget *>(obj);
if(tab)
{
QDialog dlg;
QVBoxLayout la(&dlg);
QLineEdit ed;
la.addWidget(&ed);
QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
la.addWidget(&bb);
dlg.setLayout(&la);
if(dlg.exec() == QDialog::Accepted)
{
tab->setTabText(0, ed.text());
return true;
}
}
}
// Standard event processing
return QObject::eventFilter(obj, event);
}
在实现eventFilter之后,我尝试在选项卡上调用install it,如下所示:
void MainWindow::initializeTabWidget() {
mTabWidget = new QTabWidget();
mTabWidget->setUsesScrollButtons(true);
mTabWidget->setTabsClosable(true);
mTabWidget->setMovable(true);
connect(mTabWidget, SIGNAL(currentChanged(int)), this, SLOT(activateTab(int)));
connect(mTabWidget, SIGNAL(currentChanged(int)), this, SLOT(enableActions(int)));
connect(mTabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
setCentralWidget(mTabWidget);
mTabWidget->installEventFilter(this);
}
你可以在上一个函数的最后一行找到installEventFilter
。
程序运行正常。什么都没有错误。但是,双击时我无法更改标签的名称。
这段代码:
mTabWidget->installEventFilter(this);
我也尝试使用installEventFilter(mtabWidget)
而没有运气
谢谢你的帮助。
答案 0 :(得分:2)
如果要在双击标签栏时捕获事件,则应在选项卡小部件的QTabBar
上安装事件过滤器。但QTabWidget::tabBar()
受到保护,您无法访问它。解决方案是从QTabWidget
派生一个类并实现一个返回指向QTabBar
的指针的公共函数:
#include <QTabBar>
#include <QTabWidget>
class customTab: public QTabWidget
{
Q_OBJECT
public:
customTab(QObject *parent = 0) :
QTabWidget((QWidget *)parent)
{
}
~customTab(){}
QTabBar *getTabBar()
{
return this->tabBar();
}
};
现在您可以在标签栏上安装事件过滤器(mTabWidget
是customTab
的实例):
mTabWidget->getTabBar()->installEventFilter(this);
您的事件过滤器应该是:
bool MainWindow::eventFilter(QObject *obj, QEvent *event){
if (obj == mTabWidget->getTabBar() &&
event->type() == QEvent::MouseButtonDblClick) {
...
答案 1 :(得分:2)
我建议您使用与QTabWidget :: tabBarDoubleClicked()插槽的简单连接。它已经存在,您根本不需要事件过滤器。这将导致更简单和更清洁的实施:
connect(myTabWidget, &QTabWidget::tabBarDoubleClicked,
myWindow, &MyWindow::onTabBarDoubleClicked);
(...)
void MyWindow::onTabBarDoubleClicked(int index)
{
// Code to rename the index-th tab here
// Example:
myTabWidget->setTabText(index, "some nice text");
}