QSystemTrayIcom vs. polskie znaki diakrytyczne

0

Witam

Mam problem w takim fragmencie kodu :

void Widget::Display( QString english, QString polish ){
// load icon
    QIcon icon = QIcon("icon4.ico");

    // set up and show the system tray icon
    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(this);
    trayIcon->setIcon(icon);
    trayIcon->setVisible( true );

    QTextCodec *codec = QTextCodec::codecForName("Windows-1250");
    QTextCodec::setCodecForTr(codec);

    trayIcon->showMessage(english,polish , QSystemTrayIcon::MessageIcon(1), 100);
    trayIcon->show();
}

Idea tego jest taka, że podaje dwa stringi ( słowo po ang(English) i po polsku(Polish) ) i po wywołaniu tej funkcji(slotu) pokazuje się dymek ze słowem angielskim i jego tłumaczeniem. Niestety tłumaczenie w języku polskim które zawiera znaki diakrytyczne nie działa. Pojawiają sie krzaczki.

Próbowałem różnych sposobów, ale nic nie dało oczekiwanych rezultatów.

Najbliżej byłem przy wstawieniu dwóch linijek :

QTextCodec *codec = QTextCodec::codecForName("Windows-1250");
QTextCodec::setCodecForTr(codec);

Ale wtedy dobrze wyświetla tylko wtedy jak zamiast zmiennej [i][b]polish[/b][/i] wpiszemy tr("jakiś const char *"). Niestety w takim wypadku trzeba jakoś przekonwertować QString na const char *.

Użyłem do tego sposobu:

polish.toStdString().c_str()

..ale znowu fail.

Pomóżcie mi to jakoś rozwiązać, bo zaczyna mi brakować cierpliwości.. Albo jakoś zrobić to bez użycia tr(), albo z użyciem tr(), ale z prawidłową konwersją QStringa do const char*, tak, żeby działało..

Dzięki z góry!

0

Kodek ustaw na początku programu i użyj UTF-8. I nie rozumiem, dlaczego chcesz konwertować QString do const char*?

0
tomepaw napisał(a):

Kodek ustaw na początku programu i użyj UTF-8. I nie rozumiem, dlaczego chcesz konwertować QString do const char*?

Mógłbyś jaśniej?? Już wcześniej jakieś ustawiałem, więc możliwe, że już to robiłem..

0

Daj to na przykład w main().

0

Chodzi Ci o linijkę:

QTextCodec *codec = QTextCodec::codecForName("Windows-1250");

..z tym ustawieniem kodeka?

0

Dlaczego nie używasz UTF8, które jest wbudowane ale opcjonalne w Qt?
Daj QString::fromUtf8("ążðźśµ");
albo pokaż jakiś kompilowalny dla nas kod źródłowy.

0

Tak, ta linijka do main(). Tylko ja proponowałbym użycie metody setCodecForLocale, u mnie to załatwia problemy z polskimi znakami, może u Ciebie też da radę:

int main(){
  // ...
  QTextCodec::setCodecForLocale (QTextCodec::codecForName("UTF-8"));
  // ...
}
0

@agilob, @davemajster - po przeniesieniu powyższego fragmentu do main'a Wasze pomysły nie pomogły. Wszystkie znaki diakrytyczne poza 'ó' to krzaki.

Teraz muszę na chwilę wyjść, ale za godzinę wrzucę kod.

0

Oto kody:

// main.cpp

#include <QtGui/QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include "mytimer.h"
#include "tray.h"

QFile plik2("ang.txt");
QTextStream out( &plik2 );


int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

	if( !plik2.open( QIODevice::WriteOnly | QIODevice::Append ) ){}

	Widget tray;
	MyTimer timer ;
	Retriever retriever ;
	QObject::connect( &timer, SIGNAL(Entry(QString)), &retriever, SLOT( test(QString)));
	QObject::connect( &retriever, SIGNAL(StrPrep(QString,QString)), &tray, SLOT( Display(QString,QString) ));
	
	QWidget window;
	QVBoxLayout layout;
	QPushButton quitButton("Quit"), startButton("Start");
	QPushButton stopButton("Stop"), sessionButton("Sesja"), vocabularyButton("Slowka");
	QObject::connect( &quitButton, SIGNAL(clicked()), qApp, SLOT(quit()) );
	QObject::connect( &startButton, SIGNAL(clicked()), &timer, SLOT( Counter() ) );
	QObject::connect( &stopButton, SIGNAL(clicked()), &timer, SLOT(Ending()) );

	layout.addWidget( &startButton );
	layout.addWidget( &stopButton );
	layout.addWidget( &sessionButton );
	layout.addWidget( &vocabularyButton );
	layout.addWidget( &quitButton );

	window.setLayout( &layout );

	window.show();

	return a.exec();
}
//tray.h

#ifndef TRAY_H
#define TRAY_H

#include <QSystemTrayIcon>
#include <QtDebug>
#include <QMenu>
#include <QTextCodec>
#include <QFont>
#include <QApplication>

class Widget : public QWidget{
	Q_OBJECT

public:
	Widget();

public slots:
	void Display( QString, QString );
};

#endif
// tray.cpp

#include "tray.h"

Widget::Widget(){
}

void Widget::Display( QString english, QString polish ){
	// load icon
    QIcon icon = QIcon("icon4.ico");

    // set up and show the system tray icon
    QSystemTrayIcon *trayIcon = new QSystemTrayIcon(this);
    trayIcon->setIcon(icon);
    trayIcon->setVisible( true );

    QTextCodec *codec = QTextCodec::codecForName("Windows-1250");
    QTextCodec::setCodecForTr(codec);

    trayIcon->showMessage(english, polish , QSystemTrayIcon::MessageIcon(1), 100);
    trayIcon->show();
}

Tyle powinno wystarczyć. Są inne pliki jeszcze, ale one nie mają związku. Jedynie jak w mainie widać, z obiektu retriever jest wysyłany sygnał z dwoma stringami.

..any ideas :( ??

0

Ja gdy robię aplikację w Qt to po pierwsze piszę ją w Qt Creator z kodowaniem utf-8, a w kodzie na początku działania aplikacji odpalam:

    // kodowanie UTF-8 dla tlumaczen i tekstow osadzonych na sztywno
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
0

A jeśli sprawdziłem kodowanie we wszystkich plikach programu i w niektórych było ANSII, to jeśli zmieniłem to w notepad++ poprzez edit-> UTF8, to powinno działać??

@Hostel - oprócz tego jeszcze coś robisz? Bo wkleiłem to na początek aplikacji i dalej nic..

0

Nigdy w życiu nie słyszałem wcześniej o QTextCodec... zawsze używam fromUtf8
i jak użyję tego w Twoim kodzie to działa poprawnie:
http://i.imm.io/WSx9.png
Lokacja jest zła bo mam rozwalone configi LXDE ;) ale polskie znaki widzisz poprawnie

Ogólnie kod po moich modyfikacjach, które pozwoliły mi sprawdzić Twój kod wygląda teraz tak</a>

Zmieniłem SIGNAL, SLOT i dodałem qtextstream żeby zobaczyć czy działają w ogóle polskie znaki, zmieniłem też czas wyświetlania się okna, 100ms to zdecydowanie za mało...

0

@agilob - co do samego czasu to pod Windowsem on jest ignorowany :)

Nie wiem jak, ale po zmianie kodowania we wszystkich plikach na UTF8 zaczęło działać!

Szkoda, że nie mogę Wam wszystkim za chęci do pomocy przyznać punktu. Dzięki serdeczne :)

0

Patrzę na ten wątek i załamuję ręce.
QString zawiera już znaki unicodu, wiec na zmianę kodeka znaków jest już dużo ZA PÓŹNO. Próby wyłuskania z QStringa nowego QStringa w nowym kodowaniu są skazane na porażkę, a mieszanie do tego polish.toStdString().c_str() jest przejawem totalnego chaosu w zrozumieniu problemu.
Problem tkwi w momencie konwersji z "czegoś" (np char *) na QString czyli w miejscu emitowania sygnału StrPrep, którego zawartości nie widać.
Dopóki autor nie pokarze miejsca konwersji i źródła pochodzenia polskich tłumaczeń to po prostu nie będzie dało się mu pomóc (w sposób zrozumiały bo widzę, że skonwertował swoje pliki tekstowe, zmieniając kodowanie i nie ma pojęcia czemu zaczęło działać).

1 użytkowników online, w tym zalogowanych: 0, gości: 1