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

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

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Диалоговое окно для ввода текста  (Прочитано 36298 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #45 : Июль 07, 2013, 14:15 »

если on_rescanText_triggered() уже присутствует в MainDialog, то
Код
C++ (Qt)
void MainWindow::nameNewText()
{
   MainDialog *dialog = new MainDialog;
   connect(findButton, SIGNAL(clicked()), dialog, SLOT(on_rescanText_triggered()));
   dialog->show();
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #46 : Июль 07, 2013, 17:07 »

если on_rescanText_triggered() уже присутствует в MainDialog, то
Код
C++ (Qt)
void MainWindow::nameNewText()
{
   MainDialog *dialog = new MainDialog;
   connect(findButton, SIGNAL(clicked()), dialog, SLOT(on_rescanText_triggered()));
   dialog->show();
}
Спасибо.
Если бы он там присутствовал, то вопроса бы не было. Слот on_rescanText_triggered находится в основном окне (не я его писал). В заголовочном файле я его опубликовал в Паблик и полагал, что смогу до него доступиться в MainDialog. Но получается, что не так просто это сделать (если вообще возможно), по крайней мере для меня Улыбающийся.
В общем получается так, что после того как пользователь в MainDialog произведет все настройки и нажмет кнопку add, основное окно должно обновиться (этот слот это делает). Задача несколько усложняется, тем, что при этом диалоговое окно не должно закрываться, а должно ждать следующего ввода новых данных.
Пока, что понял так, что простого пути нет использовать этот слот. Надо переписать его в MainDialog, что честно говоря не хочется делать.
Либо искать иной путь. Например все таки закрывать MainDialog при нажатии кнопки add, а затем уже срабатывает это  слот. Это наверное легче организовать, хотя пока тоже не представляю. Но даже если это решение у меня получится, то плохой выход (временный, пока не наберусь опыта и сделаю так как надо).
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #47 : Июль 07, 2013, 17:18 »

В общем получается так, что после того как пользователь в MainDialog произведет все настройки и нажмет кнопку add, основное окно должно обновиться (этот слот это делает). Задача несколько усложняется, тем, что при этом диалоговое окно не должно закрываться, а должно ждать следующего ввода новых данных.
Пока, что понял так, что простого пути нет использовать этот слот. Надо переписать его в MainDialog, что честно говоря не хочется делать.
ну так высылай сигнал при нажатии на add, а к этому сигналу приконнектишься в MainWindow::nameNewText():
Код
C++ (Qt)
void MainWindow::nameNewText()
{
   MainDialog *dialog = new MainDialog;
   connect(dialog->addButton, SIGNAL(clicked()), this, SLOT(on_rescanText_triggered()));
   dialog->show();
}
но тогда по-хорошему надо переменную диалога хранить в классе и смотреть существует ли она уже чтобы не плодить диалоги. при чем хранить не MainDialog *, а QPointer<MainDialog>, чтобы указатель автоматически обнулялся при удалении. а для автоматического удаления диалога по закрытии надо написать dialog->setAttribute(Qt::WA_DeleteOnClose);
Либо искать иной путь. Например все таки закрывать MainDialog при нажатии кнопки add, а затем уже срабатывает это  слот. Это наверное легче организовать, хотя пока тоже не представляю. Но даже если это решение у меня получится, то плохой выход (временный, пока не наберусь опыта и сделаю так как надо).
QDialog::exec()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #48 : Июль 08, 2013, 04:51 »

Код:
ну так высылай сигнал при нажатии на add, а к этому сигналу приконнектишься в MainWindow::nameNewText():
void MainWindow::nameNewText()
{
    MainDialog *dialog = new MainDialog;
    connect(dialog->addButton, SIGNAL(clicked()), this, SLOT(on_rescanText_triggered()));
    dialog->show();
}
Вот за это огромное спасибо!!! Я уж было отчаялся по поводу простого способа. Сколько времени надо потратить на обучение (приобретение опыта), что бы так легко разруливать ситуации Улыбающийся?
Понимаю, конечно что с виду уж не так все и сложно. Однако найти новичку ответ на такой вопрос не так просто. Читал литературу. Но для начинающего так примерно: существуют объекты с сигналами и слотами. Один объект посылает сигнал, другой объект принимает на свой слот. Надо только научиться правильно оформлять это. И вроде бы ничего сложного не казалось, делал это и не раз (может не особо задумываясь над механизмом). Пока не создал свой виджет и переклинило наглухо в одном направлении. А вот тут как раз и загвоздка. Слишком мало опыта. Хотя в этой ситуации если хотя бы один раз по голове не стукнешь не переклинет обратно. Сам не знаю и чего это я пытался доступиться с нового класса в майнвиндов.
В общем еще раз спасибо.
но тогда по-хорошему надо переменную диалога хранить в классе и смотреть существует ли она уже чтобы не плодить диалоги. при чем хранить не MainDialog *, а QPointer<MainDialog>, чтобы указатель автоматически обнулялся при удалении. а для автоматического удаления диалога по закрытии надо написать dialog->setAttribute(Qt::WA_DeleteOnClose);
Т.е. сделать изначально то, что пытался вначале - создать новый виджет (класс) MainDialog прямо в mainwindow.cc? Извините просто я слишком мало еще знаю, что бы понять советы.
« Последнее редактирование: Июль 08, 2013, 07:43 от Spark » Записан
Spark
Гость
« Ответ #49 : Июль 08, 2013, 05:25 »

Попутный вопрос.
Код
C++ (Qt)
void MainDialog::mainClicked()
{
...
 
...
   QString destFileName1(savePath + "/" + text + ".mfl");
   QFile::copy(":/MyTexionaries.mfl", destFileName1);
 
   QFile destFile1(destFileName1);
   destFile1.setPermissions(destFile1.permissions() | QFile::ReadOther | QFile::WriteOther);
 
   QString destFileName2(savePath + "/" + text + "_abrv.mfl");
   QFile::copy(":/MyTexionaries_abrv.mfl", destFileName2);
 
   QFile destFile2(destFileName2);
   destFile2.setPermissions(destFile2.permissions() | QFile::ReadOther | QFile::WriteOther);
 
   QString destFileName3(savePath + "/" + text + ".atx");
   QFile::copy(":/MyTexionaries.atx", destFileName3);
 
   QFile destFile3(destFileName3);
   destFile3.setPermissions(destFile3.permissions() | QFile::ReadOther | QFile::WriteOther);
   }
...
 
...
   if (caseCheckBox->isChecked())
   {
   QString command3( cfg.editTxtCommandLine );
   command3.replace( "%EDIT%", "" + destFileName3 + "" );
   if( !QProcess::startDetached( command3 ) )
   QApplication::beep();
 
   QString command2( cfg.editTxtCommandLine );
   command2.replace( "%EDIT%", "" + destFileName2 + "" );
   if( !QProcess::startDetached( command2 ) )
   QApplication::beep();
 
   QString command1( cfg.editTxtCommandLine );
   command1.replace( "%EDIT%", "" + destFileName1 + "" );
   if( !QProcess::startDetached( command1 ) )
   QApplication::beep();
   }
 
   }

В общем здесь внешний текстовый редактор последовательно должен был открыть три файла в трех вкладках. И я наивно полагал, что эта последовательность будет такова:
destFileName3
destFileName2
destFileName1
Однако порядок иной. Как лучше сделать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #50 : Июль 08, 2013, 11:45 »

о циклах и массивах никогда не слышал?

command3.replace( "%EDIT%", "" + destFileName3 + "" ); — зачем нужна магия в виде добавления пустых строк? это же бессмысленно.

попробуй вставить небольшую задержку между открытиями файлов через  QTest::qSleep().
Т.е. сделать изначально то, что пытался вначале - создать новый виджет (класс) MainDialog прямо в mainwindow.cc? Извините просто я слишком мало еще знаю, что бы понять советы.
обычно отдельные классы создаются в отдельных файлах, но в принципе это не обязательно.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #51 : Июль 08, 2013, 18:52 »

о циклах и массивах никогда не слышал?

command3.replace( "%EDIT%", "" + destFileName3 + "" ); — зачем нужна магия в виде добавления пустых строк? это же бессмысленно.

попробуй вставить небольшую задержку между открытиями файлов через  QTest::qSleep().
Т.е. сделать изначально то, что пытался вначале - создать новый виджет (класс) MainDialog прямо в mainwindow.cc? Извините просто я слишком мало еще знаю, что бы понять советы.
обычно отдельные классы создаются в отдельных файлах, но в принципе это не обязательно.

С циклами и массивами, конечно, знаком, но пока делаю так как проще мне. Понимаю, что плохо, но привыкать к менее привычному буду чуть позже, если сейчас нет особой необходимости. Мне бы сейчас отладить код, что бы он функционировал как задумал. Затем потихоньку оптимизирую Улыбающийся.

Опять, что то не то делаю. Пока не получается.
Код
C++ (Qt)
#include <QtGui>
#include <QtTest/QtTest>
#include "mfldialog.hh"
...
 
...
   if (caseCheckBox->isChecked())
   {
   QString command3( cfg.editTxtCommandLine );
   command3.replace( "%EDIT%", "" + destFileName3 + "" );
   if( !QProcess::startDetached( command3 ) )
   QApplication::beep();
 
   QTest::Sleep (200);
 
   QString command2( cfg.editTxtCommandLine );
   command2.replace( "%EDIT%", "" + destFileName2 + "" );
   if( !QProcess::startDetached( command2 ) )
   QApplication::beep();
 
   QString command1( cfg.editTxtCommandLine );
   command1.replace( "%EDIT%", "" + destFileName1 + "" );
   if( !QProcess::startDetached( command1 ) )
   QApplication::beep();
   }
 
   }

Компилятор ругается: ошибка: undefined reference to `QTest::qSleep(int)'
Записан
Spark
Гость
« Ответ #52 : Июль 08, 2013, 19:11 »

command3.replace( "%EDIT%", "" + destFileName3 + "" ); — зачем нужна магия в виде добавления пустых строк? это же бессмысленно.
Действительно бессмысленно. Но я вовсе не собирался добавлять пустые строки. Добавлял кавычки. Просто брал с примера, а там вообще тройные кавычки. Переменную проверил, обрамление destFileName3 шло двойными кавычками, ну я и подумал, что одни лишние. Убрал, вывел переменную, с виду как надо, так и оставил. Оказалось - совсем лишние (в cfg переменной они уже имеются). В общем глупо, по невнимательности.
Спасибо!
« Последнее редактирование: Июль 09, 2013, 01:40 от Spark » Записан
Spark
Гость
« Ответ #53 : Июль 09, 2013, 17:10 »

Так работает:
Код
C++ (Qt)
   if (caseCheckBox->isChecked())
   {
   QString command3( cfg.editTxtCommandLine );
   command3.replace( "%EDIT%", "" + destFileName3 + "" );
   if( !QProcess::startDetached( command3 ) )
   QApplication::beep();
 
   QEventLoop loop3;
       QTimer::singleShot(100, &loop3, SLOT(quit()));
       loop3.exec();
 
   QString command2( cfg.editTxtCommandLine );
   command2.replace( "%EDIT%", "" + destFileName2 + "" );
   if( !QProcess::startDetached( command2 ) )
   QApplication::beep();
 
   QEventLoop loop2;
       QTimer::singleShot(100, &loop2, SLOT(quit()));
       loop2.exec();
 
   QString command1( cfg.editTxtCommandLine );
   command1.replace( "%EDIT%", "" + destFileName1 + "" );
   if( !QProcess::startDetached( command1 ) )
   QApplication::beep();
Спасибо за наводку.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #54 : Июль 09, 2013, 17:27 »

одной переменной QEventLoop нельзя обойтись что ли?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Spark
Гость
« Ответ #55 : Июль 09, 2013, 17:48 »

одной переменной QEventLoop нельзя обойтись что ли?
Можно Улыбающийся.
Записан
Spark
Гость
« Ответ #56 : Июль 10, 2013, 09:54 »

Ok! Функционирует Улыбающийся. В нужном каталоге создаются подкаталоги с нужным комплектом текстовых файлов и при желании они открываются в стороннем редакторе в нужной последовательности. Т.е. создаются проекты.

Теперь задача открыть уже существующий проект. Для начала создал комбобох:
Код
C++ (Qt)
   dirComboBox3 = new QComboBox();
   QDir dir( cfg.projectTexionaryFolder );
   QFileInfoList list = dir.entryInfoList(QDir::NoFilter, QDir::NoSort);
   for (int i = 2; i < list.size(); ++i)
   {
      QFileInfo fInfo = list.at(i);
      QString fPath = fInfo.filePath();
      fPath.remove(QRegExp("/*.*_"));
      dirComboBox3 ->addItem(fPath);
   }

Ну как смог так и сделал. Работает. Может список директорий вытаскивается проще или вообще это надо было делать как то иначе?
И второе, не получается, что бы автоматически обновлялся список комбобокса при добавлении нового проекта.
Так же если в директории случайные файлы, то они то же попадают в список комбобокаса, что конечно же плохо.
Рад любой помощи в решении этих вопросов.
« Последнее редактирование: Июль 10, 2013, 10:07 от Spark » Записан
Spark
Гость
« Ответ #57 : Июль 10, 2013, 11:47 »

В конце создания нового проекта перерисовываю комбобокс. Случайные пункты с именами файлов убрал регэкспом:
Код
C++ (Qt)
void MainDialog::mainClicked()
{
...
 
...
 
   dictComboBox3->clear();
   QFileInfoList list = dir.entryInfoList(QDir::NoFilter, QDir::NoSort);
   for (int i = 2; i < list.size(); ++i)
   {
      QFileInfo fInfo = list.at(i);
      QString fPath = fInfo.filePath();
      fPath.remove(QRegExp("/*.*_"));
      if ( !fPath.contains(".") )
      {
      dictComboBox3->addItem(fPath);
      }
   }
 
   }

Остается вопрос. На сколько практично решение. Или надо было делать как то иначе?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #58 : Июль 10, 2013, 12:07 »

зачем начинать цикл с 2? Подозреваю, чтобы убрать . и ..? Для этого есть флаг.
Записан
Spark
Гость
« Ответ #59 : Июль 10, 2013, 12:15 »

зачем начинать цикл с 2? Подозреваю, чтобы убрать . и ..? Для этого есть флаг.
Именно для этого. Учусь Улыбающийся.
Спасибо.
Немного изменил алгоритм. Пункты с файлами убрал с помощью фильтра.
Код
C++ (Qt)
...
 
   dictComboBox3->clear();
   QFileInfoList list = dir.entryInfoList(QDir::Dirs, QDir::NoSort);
   for (int i = 2; i < list.size(); ++i)
   {
      QFileInfo fInfo = list.at(i);
      QString fPath = fInfo.filePath();
      fPath.remove(QRegExp("/*.*_"));
      dirComboBox3->addItem(fPath);
   }
 
   }
Сейчас разберусь с флагом.
А вытащить список директорий иным способом нельзя? Нет волшебной функции?
« Последнее редактирование: Июль 10, 2013, 12:18 от Spark » Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


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