Unsolved Dynamische Sprachumschaltung bei QDockWidgets
-
Hallo zusammen,
ich habe eine dynamische Sprachumschaltung in mein Programm integriert und die scheint auch soweit korrekt zu funktionieren. Allerdings werden die Texte von dynamisch erzeugten QDockWidgets nicht geändert.
Mein Programm erzeugt drei Tabs und füllt diese mit drei Widgets, welche hauptsächlich aus Labeln bestehen:QDockWidget* item = addTab( widget1, tr("Tab 1") ); QDockWidget* item2 = addTab( widget2, tr("Tab 2") ); QDockWidget* item3 = addTab( widget3, tr("Tab 3") ); this->tabifyDockWidget(item, item2); this->tabifyDockWidget(item2, item3); QDockWidget* MainWindow::addTab( QWidget* widget, QString s_title ) { QDockWidget *item = new QDockWidget( s_title, this ); item->setWidget( widget ); addDockWidget( Qt::LeftDockWidgetArea, item ); return item; }
Nun habe ich nach dem Beispiel (Link) eine dynamische Sprachumschaltung eingebaut.
void MainWindow::createLanguageMenu( void ) { QComboBox* languageComboBox = new QComboBox(); QString defaultLocale = QLocale::system().name().replace( "_", "-" ); _m_langPath = QApplication::applicationDirPath(); _m_langPath.append( _languageDir ); QDir dir( _m_langPath ); QStringList fileNames = dir.entryList( QStringList( "translation_*.qm" ) ); for ( int i = 0; i < fileNames.size(); ++i ) { QString locale; locale = fileNames[ i ]; locale.truncate( locale.lastIndexOf( '.' ) ); locale.remove( 0, locale.indexOf('_') + 1 ); QString lang = QLocale::languageToString( QLocale( locale ).language() ); languageComboBox->insertItem ( i, lang, locale ); languageComboBox->setItemIcon( i, QPixmap(":/ressources/icons" + _languageDir + lang + ".png") ); } languageComboBox->setCurrentIndex( languageComboBox->findData( defaultLocale ) ); connect(languageComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( languageComboBoxSelectionChange( int ) ) ); this->ui->statusBar->addPermanentWidget( languageComboBox ); }
void MainWindow::changeTranslator( QTranslator& translator, const QString& filename ) { qApp->removeTranslator( &translator ); if( translator.load( QCoreApplication::applicationDirPath() + _languageDir + filename ) ) { qApp->installTranslator( &translator ); } }
void MainWindow::loadLanguage( const QString& s_locale ) { if( _m_currLang != s_locale ) { _m_currLang = s_locale; // Change the current locale QLocale locale = QLocale( _m_currLang ); QLocale::setDefault( s_locale ); QString languageName = QLocale::languageToString( locale.language() ); changeTranslator( _m_translator, QString( "translation_%1.qm" ).arg( s_locale ) ); ui->statusBar->showMessage( tr( "Sprache geändert zu: %1" ).arg( languageName) ); } }
void MainWindow::languageComboBoxSelectionChange( int index ) { QComboBox* p_ComboBox = qobject_cast< QComboBox* >( sender() ); // Get the locale from combobox and call translation loadLanguage( p_ComboBox->itemData( index ).toString() ); }
void MainWindow::changeEvent( QEvent* event ) { if( 0 != event ) { // Switch all Events switch( event->type() ) { // This event is triggered if a translator is loaded case QEvent::LanguageChange: { ui->retranslateUi( this ); break; } // This event is triggered if the system, language changes case QEvent::LocaleChange: { QString locale = QLocale::system().name(); locale.truncate( locale.lastIndexOf( '_' ) ); loadLanguage( locale ); break; } } } QMainWindow::changeEvent( event ); }
Wenn ich die Sprache nun ändere, erhalte ich eine sprachabhängige Nachricht in meiner Statusbar, aber in meinen Tabs wird die Sprache nicht geändert.
Wo steckt der Fehler, bzw. was habe ich falsch gemacht?Danke für die Hilfe!
-
Die Widgets
widget1
..widget3
, die du in die Tabs setzt - haben die einen parent?
QDockWidget::setWidget()
setzt den parent m.W.n. nicht automatisch, und ohne Parent erhalten die Widgets auch keine Events.
Außerdem musst du in den Widgets selbst natürlich auch eine ArtretranslateUi()
implementieren und die dort aus demevent()
-Handler heraus aufrufen, wenn dasLocaleChange
-Event eintrifft.