LINUX.ORG.RU

[Qt4,C++] Правильно сделать свой потомок виджета


0

0

Задался такой задачей - сделать свой потомок QFileDialog, но со своими надписями в DialogLabel (они на английском, я хочу на русском).

Так как я только начал изучать [Qt4,C++], то пока не могу понять, что я делаю не так.
значит, завёл я myFd.h и myFd.cpp

myFd.h:

#ifndef MYFD_H
#define MYFD_H
#include <QFileDialog>

class myFd : public QFileDialog
{
public:
myFd (QWidget *parent=0);
~myFd ();
};
#endif

myFd.cpp:

#include <QtGui>
#include "myFd.h"

myFd::myFd (QWidget *parent)
: QFileDialog (parent)
{
setLabelText(QFileDialog::LookIn,tr("Имя файла"));
setLabelText(QFileDialog::FileName,tr("Имя файла"));
setLabelText(QFileDialog::FileType,tr("Тип файла"));
setLabelText(QFileDialog::Accept,tr("Открыть"));

}

myFd::~myFd ()
{
}

в главной программе:

...
#include "myFd.h"
....
....
//вызыватеся при клике на кпопочку и в QTextEdit с именем cert передаётся имя файла

cert->setText (myFd::getOpenFileName(this,tr("Укажите файл сертификата"), conf_dir, tr("Файл сертифитката (certificate.crt);;Любой файл (*.*)")));

Но вызываемый диалог рисуется со стандартными надписями :(

Что я делаю не так и в какую сторону мне надо читать документацию?

Qt не знаю, но одно могу точно сказать, чтобы поправить надписи надо просто локализацию править, а не свой велосипед строить, ну не может же быть эта надпись жестко на англйском :)

anonymous
()

Во-первых, вы действительно думаете что компиллятор обладает некоей магией, что увидя вызов tr(...) сгенерирует константу в юникоде в нужной локали (прочитав мысли?) из произвольной кодировки, в которой был сохранён исходник? Hint: Никогда не используйте НЕ-ланинские символы в коде.

Во-вторых, не нужно наследоваться, если в этом нет крайней необходимости. А у вам её нет.

В-трерьих, все потенциально локализируемые надписи уже заведены в систему перевода. Убедиться в этом (или обратном) можно открыв исходник QFileDialog и найти соответствующие надписи. Если в программе надписи так и остались непереведёнными - откройте файл /path/to/qt/sources/translations/qt_ru.ts Лингвистом и допереведите.

P.S. Только что сам это сделал. Да, некоторые переводы незавершены в Qt 4.4, видно сказывается нехватка переводчиков на русский.

Dendy ★★★★★
()

Не согласен с товарищем по поводу правки исходников Qt. Полный отстой и безграмотность, противоречащая идеи Qt о свободе выбора кодировок и... А tr, товарищ дорогой, для того и существует, что не-English-UTF-8 программистам жилось вольготнее. Так что ваш коммент ф топку, о премногоуважаемый вы наш.

У меня все работает. Вот исходники.

.h /* 2 * 3 * © Птн Май 16 16:23:45 MSD 2008, DenXi 4 */ 5 6 #ifndef MYDIALOG_H 7 #define MYDIALOG_H 8 9 #include <QFileDialog> 10 #include "ui_mainwindow.h" 11 12 class QWidget; 13 class MyDialog: public QFileDialog 14 { 15 Q_OBJECT 16 public: 17 MyDialog(QWidget *parent=0); 18 ~MyDialog(); 19 }; 20 21 #endif 22

.cpp /* 2 * 3 * © Птн Май 16 16:23:45 MSD 2008, DenXi 4 */ 5 6 #include <QWidget> 7 #include "mydialog.h" 8 9 MyDialog::MyDialog(QWidget *parent): 10 QFileDialog(parent) 11 { 12 setLabelText(QFileDialog::LookIn,tr("Имя файла")); 13 setLabelText(QFileDialog::FileName,tr("Имя файла")); 14 setLabelText(QFileDialog::FileType,tr("Тип файла")); 15 setLabelText(QFileDialog::Accept,tr("Открыть")); 16 } 17 18 MyDialog::~MyDialog() 19 { 20 } 21 22 ~ ~

main.cpp /* 2 * 3 * 4 * © Птн Май 16 16:23:45 MSD 2008, DenXi 5 */ 6 7 #include <QApplication> 8 #include <QTextCodec> 9 #include "mydialog.h" 10 11 int main (int argc, char *argv[]) 12 { 13 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); 14 QTextCodec::setCodecForTr(codec); 15 QApplication app(argc, argv); 16 MyDialog w; 17 w.exec(); 18 19 return 0; 20 }

anonymous
()

Не согласен с товарищем по поводу правки исходников Qt. Полный отстой и безграмотность, противоречащая идеи Qt о свободе выбора кодировок и... А tr, товарищ дорогой, для того и существует, что не-English-UTF-8 программистам жилось вольготнее. Так что ваш коммент ф топку, о премногоуважаемый вы наш.

У меня все работает. Вот исходники.

.h /* 2 * 3 * © Птн Май 16 16:23:45 MSD 2008, DenXi 4 */ 5 6 #ifndef MYDIALOG_H 7 #define MYDIALOG_H 8 9 #include <QFileDialog> 10 #include "ui_mainwindow.h" 11 12 class QWidget; 13 class MyDialog: public QFileDialog 14 { 15 Q_OBJECT 16 public: 17 MyDialog(QWidget *parent=0); 18 ~MyDialog(); 19 }; 20 21 #endif 22

.cpp /* 2 * 3 * © Птн Май 16 16:23:45 MSD 2008, DenXi 4 */ 5 6 #include <QWidget> 7 #include "mydialog.h" 8 9 MyDialog::MyDialog(QWidget *parent): 10 QFileDialog(parent) 11 { 12 setLabelText(QFileDialog::LookIn,tr("Имя файла")); 13 setLabelText(QFileDialog::FileName,tr("Имя файла")); 14 setLabelText(QFileDialog::FileType,tr("Тип файла")); 15 setLabelText(QFileDialog::Accept,tr("Открыть")); 16 } 17 18 MyDialog::~MyDialog() 19 { 20 } 21 22 ~ ~

main.cpp /* 2 * 3 * 4 * © Птн Май 16 16:23:45 MSD 2008, DenXi 5 */ 6 7 #include <QApplication> 8 #include <QTextCodec> 9 #include "mydialog.h" 10 11 int main (int argc, char *argv[]) 12 { 13 QTextCodec *codec = QTextCodec::codecForName("UTF-8"); 14 QTextCodec::setCodecForTr(codec); 15 QApplication app(argc, argv); 16 MyDialog w; 17 w.exec(); 18 19 return 0; 20 }

anonymous
()

Не согласен с товарищем по поводу правки исходников Qt. Полный отстой и безграмотность, противоречащая идеи Qt о свободе выбора кодировок и... А tr, товарищ дорогой, для того и существует, что не-English-UTF-8 программистам жилось вольготнее.
Так что ваш коммент ф топку, о премногоуважаемый вы наш.

У меня все работает. Вот исходники.

.h
/*
2 *
3 * © Птн Май 16 16:23:45 MSD 2008, DenXi
4 */
5
6 #ifndef MYDIALOG_H
7 #define MYDIALOG_H
8
9 #include <QFileDialog>
10 #include "ui_mainwindow.h"
11
12 class QWidget;
13 class MyDialog: public QFileDialog
14 {
15 Q_OBJECT
16 public:
17 MyDialog(QWidget *parent=0);
18 ~MyDialog();
19 };
20
21 #endif
22

.cpp
/*
2 *
3 * © Птн Май 16 16:23:45 MSD 2008, DenXi
4 */
5
6 #include <QWidget>
7 #include "mydialog.h"
8
9 MyDialog::MyDialog(QWidget *parent):
10 QFileDialog(parent)
11 {
12 setLabelText(QFileDialog::LookIn,tr("Имя файла"));
13 setLabelText(QFileDialog::FileName,tr("Имя файла"));
14 setLabelText(QFileDialog::FileType,tr("Тип файла"));
15 setLabelText(QFileDialog::Accept,tr("Открыть"));
16 }
17
18 MyDialog::~MyDialog()
19 {
20 }
21
22
~
~

main.cpp
/*
2 *
3 *
4 * © Птн Май 16 16:23:45 MSD 2008, DenXi
5 */
6
7 #include <QApplication>
8 #include <QTextCodec>
9 #include "mydialog.h"
10
11 int main (int argc, char *argv[])
12 {
13 QTextCodec *codec = QTextCodec::codecForName("UTF-8");
14 QTextCodec::setCodecForTr(codec);
15 QApplication app(argc, argv);
16 MyDialog w;
17 w.exec();
18
19 return 0;
20 }

anonymous
()
Ответ на: комментарий от anonymous

Эсли это был ответ на моё сообщение, то остаётся только надеяться что автор треда будет более вмеяем и прислушается к тому что я сказал. А вам могу сказать что вы заблуждаетесь в:

1. Зачем существует функция tr().
2. Править исходники Qt никто не предлагал.

Dendy ★★★★★
()

1. Автору. У вас не работает, потому что вы вызываете статический метод myFd::getOpenFileName, который достался вам от класса-родителя. И который знать не знает о том, что вы что-то унаследовали, и скорее всего тупо сам создает объект типа QFileDialog.
Так, что если хочется, чтобы ваш класс заработал, то экземпляр класса надо создавать явно, что и было продемонстрировано здешним камрадом (аж в трех копиях).

2. Но лучше всего пользоваться переводами, а не наследованием, что вам тоже здесь посоветовали

Slader
()
Ответ на: комментарий от Slader

Спасибо всем.

Дело тут не сколько в переводах, а сколько в попытке разобраться, как это всё работает. Да и нужен был не сколько перевод, сколько именно "свои" надписи.

При явном создании экземпляра класса у меня тоже всё работало, просто не хотелось писать лишний код.

Unnamed_Hero ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.