我正在使用Visual Studio和Qt。我无法访问Qt设计器。这一切都是通过编码完成的(C++);
我有一个名为EasyPaint的开源软件。
我在尝试重命名选项卡时遇到了困难。我希望能够在用户双击选项卡本身时重命名选项卡。
我创建了一个新函数来过滤 doubleClick 事件:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
`enter code here`{
if (event->type() == QEvent::MouseButtonDblClick) {
return true;
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
然后我将这一行添加到初始化 TabWidget 的函数中:
installEventFilter(mTabWidget);
任何人都可以指导我完成这个。谢谢
很可能Qt不允许在选项卡名称上打开内联编辑器。 因此,您很可能必须创建并运行一个非常小的QDialog来查询新名称:
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);
}
可能是Qt的动态内存管理不喜欢本地类实例,所以你必须将所有创建的类实例转换为使用new
创建的指针,但是请不要忘记告诉QDialog在关闭时删除或在查询新名称后调用dlg->deleteLater()
。
通过假内联编辑器解决此问题的另一种方法需要更多的工作:
- 创建 QLineEdit 将其
- 移动到选项卡的正上方,将其放在前面并将键盘焦点设置为它
- 有线信号和插槽
- 按回车键应使用 QLineEdit 的内容
- 从行编辑中离开焦点应被视为"中止"并删除行编辑器
- 实施槽以执行所需的操作。
您可以以休光方式编写事件过滤器:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == mTabWidget &&
event->type() == QEvent::MouseButtonDblClick) {
QTabWidget *tab = qobject_cast<QTabWidget *>(obj);
// Set tab(s) names
tab->setTabText(0, "New Name");
}
// Standard event processing
return QObject::eventFilter(obj, event);
}