Qt Tab переименовывается при двойном щелчке

Я использую Visual Studio с Qt.
У меня нет доступа к Qt Designer. все это делается с помощью кодирования (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);

Может кто-нибудь, пожалуйста, проведите меня через это.
Спасибо

1

Решение

Скорее всего, 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
  • переместите его прямо над вкладками, выдвиньте его вперед и установите на нем фокус клавиатуры
  • проводные сигналы и слоты
    • нажатие Enter должно использовать содержимое QLineEdit
    • оставление фокуса от редактирования строки следует рассматривать как «прервать» и удалить редактор строк
  • реализовать слоты, чтобы сделать то, что нужно.
0

Другие решения

Вы можете написать фильтр событий следующим образом:

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);
}
0

По вопросам рекламы [email protected]