Qt TabWidget Tab 在运行时重命名
Qt TabWidget Tab rename in runtime
>我正在将C++与Visual Studio 2010和Qt一起使用;
一切都是通过代码完成的。我无法访问Qt Designer。
我的问题是:
我正在开发一个名为"EasyPaint"的开源软件。我正在尝试实现选项卡重命名(当用户双击选项卡时,他可以在运行时重命名它)
为此,我使用了一个事件过滤器:
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);
}
实现事件过滤器后,我尝试在选项卡上调用安装它,如下所示:
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)
代替,但没有运气
谢谢你的帮助。
如果要在双击选项卡栏时捕获事件,则应在选项卡小部件的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) {
...
我建议您使用与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");
}
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 如何在运行时创建和命名对象?
- 如何在运行时阻止数组重置
- 在 c++ 中在运行时声明对命名空间的引用
- 在使用swig到OCAML时,奇怪的重命名行为
- 在运行时选择给定的命名空间
- C++ 继承时重命名函数参数
- 为什么当循环再次运行时,此输出"请重试"?
- 当程序作为服务运行时重定向 std::cout
- 当目标路径存在时,curl SFTP 重命名
- 加载时重命名窗体MSVisual c++
- Qt TabWidget Tab 在运行时重命名
- 双击Qt选项卡时重命名
- 在vc++中进行构建时重命名dll文件
- QProcess:运行时重置工作目录
- 你能在使用typedef时重命名成员吗
- CPP:使用重命名功能时出错