[solved] Translation on the fly crashes
-
You can also use a service like "pastbin":http://pastebin.com/
-
Only what is needed to build and trigger the crash
-
What do you mean by "images files to be able to hit the button" ?
-
In order to trigger the crash, you have to run the application then hit a button to load a widget. Then you have to hit another button to start the translation. (and then it crashes).
If you want to trigger the crash yourself, you would need the whole program I think. (I have got too many classes ad I don't really know what is the minimal stuff you would need to be able to compile it)
-
CVS to the rescue ! Or if it's not an option, the best technique is to strip your software down (or rebuild it from the ground) until you either have the bug again or it stop to happen (depends which direction you started with
-
All recent CVS system proposes to create local repositories that you can use.
Generally this means that you are trying to debug a release version
-
What was the problem ?
You're welcome !
Don't forget to update the thread's title prepending solved so other forum users may know a solution has been found :)
-
So let me explain the situation, it may helps people.
I have a mainWindow which contains a mainWidget which in turns load several secondary widgets. (loaded one by one)
When you add a translation in your application using qApp->installTranslator(& translator) then all the following calls to QObject::tr() will look up in the translator for a translated text. So you should call retranslateUi() after
qApp->installTranslator() by reimplementing QWidget::changeEvent() and intercept any QEvent::LanguageChange event.In order to translate dynamically my secondary widgets I had to reimplement each widget's ChangeEvent(*event)
function and call retranslateUi(), which is what I did.
And this is what causes the problem.I was intercepting the event LanguageChange in the mainWidget and was calling retranslateUi() right after. LanguageChange was also intercepted by the secondary widget (which is a child of mainWidget) and retranslateUi() was called aswell.
I had to remove the call of retranslateUi() in the mainWidget (There was nothing but tooltips to translate in this widget) then everything worked.
Here is the code :MainWindow :
@
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
...
translator = new QTranslator();connect(sysSettings,SIGNAL(toEnglish()),this,SLOT(changeToEnglish())); connect(sysSettings,SIGNAL(toFrench()),this,SLOT(changeToFrench()));
...
}void MainWindow::changeToFrench()
{
if ( translator )
qApp->removeTranslator( translator );
}void MainWindow::changeToEnglish()
{
if ( translator )
qApp->removeTranslator( translator );translator->load( "dcl_en",QApplication::applicationDirPath()); qApp->installTranslator( translator );
}
void MainWindow::changeEvent(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
retranslateUi();
}
QMainWindow::changeEvent(e);
}void MainWindow::retranslateUi()
{
system_settings->setText(tr("Paramètres système"));
about->setText(tr("A propos..."));
}
@MainWidget :
@
void mainWidget::changeEvent(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{
retranslateUi();
}
}void mainWidget::retranslateUi()
{
ui->btn_addSpec->setToolTip(tr("xx"));
ui->btn_delSpec->setToolTip(tr("xx"));
ui->btn_corp->setToolTip(tr("xx"));
ui->btn_curv->setToolTip(tr("xx"));
ui->btn_identity->setToolTip(tr("xx"));
ui->btn_eggs->setToolTip(tr("xx"));
ui->btn_sante->setToolTip(tr("xx"));
}
@a secondary widget :
@
void ui_identity::changeEvent(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
this->translateUi();
}
}void ui_identity::translateUi()
{
QStringList list=(QStringList()<<tr("xxx")<<tr("yyy")<<tr("zzz"));
ui->cbx_sex->addItems(list);ui->btn_modify->setToolTip(tr("ssssssss"));
}
@and the setting window called from a menubar :
@
ui_sys_settings::ui_sys_settings(QWidget *parent) :
QWidget(parent),
ui(new Ui::ui_sys_settings)
{
ui->setupUi(this);
connect(ui->rdb_english, SIGNAL(clicked()),this,SIGNAL(toEnglish()));
connect(ui->rdb_french, SIGNAL(clicked()),this,SIGNAL(toFrench()));if(parentWidget->getSettings()->getLanguage() == "French") this->ui->rdb_french->setChecked(true); else if(parentWidget->getSettings()->getLanguage() == "English") this->ui->rdb_english->setChecked(true);
}
void ui_sys_settings::changeEvent(QEvent *e)
{
if(e->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this);
}
}
@