Qt, QOpenfile Dialog

0

Witajcie,
to znów ja :) dalej bawię się w Qt i napotkałem taki problem
aczkolwiek bawię się z QOpenFile Dialog i wyświetlanie w QWidgetList
i mam problem bo raz mi wyświetla dobrze + dodatkowo linijka jakiś krzaków a raz nie wyświetla mi wgl.

mam już trochę kodu który tym operuje i trudniej mi wyłapać błąd.
Prosił bym o pomoc.
Tutaj z rzut ekranu z przykładowym błędem.
Zrzut_ekranu_z_2012-09-14_215150_png_300x300_q85.jpg
zamieszczam poniżej kod.

void okno::on_actionOpen_triggered()
{

    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                     "/home",
                                                     tr("Kasia files(*.kas);;Text files (*.txt);;XML files (*.xml);;All files (*.*)"));
    if( !fileName.isNull() )
    {
        PrzepiszPlik(QString::fromStdString("bin/outbase.kas"),fileName);
    }
    ListWidgetDwaRefresh();
} 
void okno::ListWidgetDwaRefresh()
{
    ui->listWidget_2->clear();



    fstream plik;
    string s;
    plik.open("bin/outbase.kas",ios::in);
    s.clear();
    if( plik.good() == true )
    {
        while(!plik.eof())
        {
            getline(plik,s);
            QString qstr;
            qstr=OdPath(QString::fromStdString(s));
            ui->listWidget_2->addItem(qstr);
            s.clear();
        }
    }
    else
    {
        OpenError *o = new OpenError;
        o->show();
    }
    plik.close();
} 
 QString okno::OdPath(QString qstr)
{
    string s,str;
    s.clear();
    str.clear();
    QString w,z;
    w.clear();
    z.clear();
    s.clear();
    s[0]='/';
    str=qstr.toStdString();
    int i=qstr.size()-5;
    while(str[i]!=s[0])
    {
        w+=str[i];
        i--;
    }
    z.resize(w.size());
    for(int i=0;i<w.size();i++)
        z[w.size()-i-1]=w[i];

    return z;
}
 void okno::PrzepiszPlik(QString qs, QString a)
{
    QApplication::setOverrideCursor(Qt::WaitCursor);
    rename(qs.toStdString().c_str(),"bin/temp.kas");
    fstream plik,temp;
    temp.open("bin/temp.kas",ios::in);
    plik.open(qs.toStdString().c_str(),ios::out);
    if( plik.good() == true && temp.good() == true)
        {
            while(!temp.eof())
            {
                string str2;
                str2.clear();
                getline(temp,str2);
                plik<<str2<<"\n";
            }
            plik <<a.toStdString().c_str()<<"\n";
        }
        else
        {
            OpenError*o = new OpenError();
            o->show();
        }
    temp.close();
    plik.close();
    remove("bin/temp.kas");
    QApplication::restoreOverrideCursor();
}
0

Masz polskie znaki w nazwach otwieranych w OpenFileDialog?Jak tak,to trzeba ci ustawić kodeki na polskie znaki.Robisz to kodem:

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

Wrzuć do do main() zaraz pod utworzonym obiektem QApplication.

0

a co do codec to wywala mi błędy /home/shial/Programowanie/C++/gui/abc-build-desktop/../abc/main.cpp:7: błąd:incomplete type 'QTextCodec' used in nested name specifier

A jeszcze jedno jestem na linuxie i pisze pod linuxem aktualnie ale z przyjemnością dowiem się jak to jest gdy:

 #if defined(_WIN32)
        QApplication a(argc, argv);
    QTextCodec *codec=QTextCodec::codecForName("Windows-1250");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForCStrings(codec);
    #elif defined(__linux__)
        /A LINUX ??
    // #else more?
    #endif 
0

user image
Człowieku,na linuksie chcesz ustawiać windowsowego kodeka?Litości...
Zmień to na UTF-8 zamiast Windows-1250

0

Aczkolwiek błąd z krzaczkami rozwiązałem.
Polegał on na tym, że:
w funkcji

 void okno::ListWidgetDwaRefresh()
{
    ui->listWidget_2->clear();



    fstream plik;
    string s;
    plik.open("bin/outbase.kas",ios::in);
    s.clear();
    if( plik.good() == true )
    {
        while(!plik.eof())
        {
            getline(plik,s);
            if(s.size()>4)
            {
                QString qstr;
                qstr=OdPath(QString::fromStdString(s));
                ui->listWidget_2->addItem(qstr);
            }
            s.clear();
        }
    }
    else
    {
        OpenError *o = new OpenError;
        o->show();
    }
    plik.close();
}

pętla while wykonywała to dla każdej pobranej linii z pliku nawet ze znakami specjalnymi.
A w funkcji wykorzystanej w

qstr=OdPath(QString::fromStdString(s)); 

w tym momencie w powyższej pętli
cofałem się w Stringu do tyłu zawsze o 4 nawet jeżeli był krótszy co wychodziło po za jego zakres i w efekcie pojawiały się krzaki.
Tak więc potrzebna jest instrukcja warunkowa, która gwarantuje, że string dostający się do tej funkcji ma długość większą od 4.

0

Mi zawsze starczala taka 1 linijka w konstruktorze okna.

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

I wszedzie byla obsluga polskich znakow w porzadku.

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