Название: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: domiurg от Май 25, 2011, 11:45
Всем доброго времени суток) Я пишу под Линуксом, а именно Убунту 10,04 У меня возникла вот такая проблемма: Когда я использую QFileDialog для открытия файла (извлечения имени файла), код: QString fileName = QFileDialog::getOpenFileName( this, tr("open File"), QDir::currentPath(), tr("txt Files (*.txt)") );
То в самом уже окне выбора файлика всё отлично работает, но если не выбрать какой либо файл и щёлкнуть "Закрыть окно"(Крестик) или Cancel, То абсолютно всё зависает намертво и выключаеться моя программа только киллом процесса. Ниже в той же самой программе есть такой же QFileDialog, только на сохранение файла код: QString sfilename = QFileDialog::getSaveFileName( this, tr("Save Document"), QDir::currentPath(), tr("Documents (*.doc)") );
И вот в нём всё работает на ура. Подскажите пожалуйста в чём может быть поблемма
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: Пантер от Май 25, 2011, 11:48
Покажи ниже код.
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: domiurg от Май 25, 2011, 11:51
Вот: #include "window.h" #include <QMenu> #include <QMenuBar> #include <QApplication> #include <QFileDialog> #include <QDesktopWidget> #include <QString> #include <QPushButton> #include <QList>
string Data; int numLines;
void center(QWidget &widget, int w, int h) { int x, y; int screenWidth; int screenHeight;
QDesktopWidget *desktop = QApplication::desktop();
screenWidth = desktop->width(); screenHeight = desktop->height();
x = (screenWidth - w) / 2; y = (screenHeight - h) / 2;
widget.move( x, y ); }
Window::Window(QWidget *parent) : QMainWindow(parent) { int WIDTH = 350, HEIGHT = 250;
setFixedSize(WIDTH,HEIGHT);
QPixmap openpix("pics/open.jpg"); QPixmap quitpix("pics/quit.jpg");
QAction *open = new QAction(openpix, "&Open", this); open->setShortcut(tr("CTRL+O")); QAction *quit = new QAction(quitpix, "&Close", this); quit->setShortcut(tr("CTRL+Q"));
QMenu *file; file = menuBar()->addMenu("&File"); file->addAction(open); file->addSeparator(); file->addAction(quit);
label1 = new QLabel("0", this); label1->setGeometry(5,20,350,30); label1->setText("Current file: None");
QPushButton *generate = new QPushButton("Generate htm file", this); generate->setGeometry(100, 50, 150, 40);
center(*this, WIDTH,HEIGHT);
connect(open, SIGNAL(triggered()), this, SLOT(OpenFile())); connect(quit, SIGNAL(triggered()), qApp, SLOT(quit())); connect(generate, SIGNAL(clicked()), this, SLOT(htmGenerator())); }
void Window::OpenFile() {
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"",tr("TXT Files (*.txt)")); QString fileName = QFileDialog::getOpenFileName( this, tr("open File"), QDir::currentPath(), tr("txt Files (*.txt)") );
string name = fileName.toStdString();
int found=0; found=name.find_last_of("/\\"); QString filenam = QString::fromStdString(name.substr(found+1)); label1->setText("Current file: "+filenam);
const char* fname; fname = name.c_str();
ifstream in(fname,ios::in);
char ch; int Lines=0;
while (!in.eof()) { ch = in.get(); if ((ch >= 32 && ch<=127) || ch == 10) Data = Data + ch; if (ch == 10) Lines++; }
in.close(); numLines = Lines; }
void Window::htmGenerator() //generates html file { QList<string> Lines;
/*QString l = QString::number(numLines,10); label1->setText(l);*/
int start=0, length=0;
for (unsigned int i=0; i<Data.length(); i++) { char ch = Data[i]; length++; if (ch == 10) { Lines << Data.substr(start,length); start = i; length=0; } }
//testing Lines list /*ofstream out("test.txt",ios::trunc); for (int i=0; i<Lines.size(); i++) out << Lines[i]; out.close();*/
QString sfilename = QFileDialog::getSaveFileName( this, tr("Save Document"), QDir::currentPath(), tr("Documents (*.doc)") ); }
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: Пантер от Май 25, 2011, 11:56
Когда ты закрываешь диалог, fileName становится пустой. И дальше по коду из-за этого происходит зависание. Делай вот так: C++ (Qt) const QString fileName = QFileDialog::getOpenFileName( this, tr("open File"), QDir::currentPath(), tr("txt Files (*.txt)") ); if (fileName.isEmpty ()) { return; }
Название: Re: Зависает QFileDialog когда при Открытии файла не ук
Отправлено: domiurg от Май 25, 2011, 12:00
Спасибо большое, помогло)) Буду теперь знать)
Вопрос решился)
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: Пантер от Май 25, 2011, 12:06
Слух, а нафига ты примешиваешь stl? Все же лучше и проще реализовать средствами Qt.
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: domiurg от Май 25, 2011, 12:10
Я со стрингами Qt-шными плохо лажу(, я только недавно начал писать GUI и начал с освоения QT
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: Пантер от Май 25, 2011, 12:16
А ты почитай в ассистенте, там все на самом деле легко и просто. В stl надобность полностью отпадает.
Название: Re: Зависает QFileDialog когда при Открытии файла не указан файл
Отправлено: domiurg от Май 25, 2011, 12:20
Спасибо) почитаю
|