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

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

2 ответа

Решение

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

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

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);
 }
Другие вопросы по тегам