2014-11-17 2 views
1

Я использую визуальную студию с Qt. У меня нет доступа к дизайнеру Qt. все это делается с помощью кодирования (C++);Qt Tab переименовывается при двойном щелчке

У меня есть программное обеспечение с открытым исходным кодом под названием 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); 

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

ответ

0

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

Благодарю вас за помощь. – AAFF

+0

void MainWindow :: initializeTabWidget() { mTabWidget = new QTabWidget(); mTabWidget-> setUsesScrollButtons (true); mTabWidget-> setTabsClosable (true); mTabWidget-> setMovable (true); connect (mTabWidget, SIGNAL (currentChanged (int)), это, SLOT (activateTab (int))); connect (mTabWidget, SIGNAL (currentChanged (int)), это, SLOT (enableActions (int))); connect (mTabWidget, SIGNAL (tabCloseRequested (int)), это, SLOT (closeTab (int))); \t \t installEventFilter (mTabWidget); setCentralWidget (mTabWidget); } Как я могу подключить вашу функцию? является installeventfilter (QObject)? – AAFF

+0

Должен ли я добавить installeventfilter в вышеуказанные функции? @ St0fF – AAFF

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); 
} 
Смежные вопросы