Russian Qt Forum
Сентябрь 22, 2024, 16:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Зависает QFileDialog когда при Открытии файла не указан файл  (Прочитано 4883 раз)
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)") );


И вот в нём всё работает на ура.

Подскажите пожалуйста в чём может быть поблемма
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 25, 2011, 11:48 »

Покажи ниже код.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
domiurg
Гость
« Ответ #2 : Май 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)") );
}

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 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;
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
domiurg
Гость
« Ответ #4 : Май 25, 2011, 12:00 »

Спасибо большое, помогло)) Буду теперь знать)

Вопрос решился)
« Последнее редактирование: Май 25, 2011, 12:02 от domiurg » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 25, 2011, 12:06 »

Слух, а нафига ты примешиваешь stl? Все же лучше и проще реализовать средствами Qt.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
domiurg
Гость
« Ответ #6 : Май 25, 2011, 12:10 »

Я со стрингами Qt-шными плохо лажу(, я только недавно начал писать GUI и начал с освоения QT
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Май 25, 2011, 12:16 »

А ты почитай в ассистенте, там все на самом деле легко и просто. В stl надобность полностью отпадает.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
domiurg
Гость
« Ответ #8 : Май 25, 2011, 12:20 »

Спасибо) почитаю
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.065 секунд. Запросов: 22.