Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Spark от Июнь 30, 2013, 03:25



Название: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 03:25
Тренируюсь на готовой программе. Есть окно mainwindow.cc/mainwindow.hh. Задача вывести простейшее диалоговое окно для ввода текста при нажатии на кнопку.

В mainwindow.hh прописал кнопку и класс:
Код
C++ (Qt)
class MainWindow: public QMainWindow, public DataCommitter
{
 Q_OBJECT
...
...
private:
...
...
 QToolButton * addNewText;
...
...
class Dialog: public QWidget
{
   Q_OBJECT
 
public:
   Dialog(QWidget * parent = 0);
 
private slots:
   void setText();
};

В mainwindow.сс поставил кнопку:
Код
C++ (Qt)
 addNewText = new QToolButton ( navToolbarBefore );
 addNewText->setIcon( QIcon (":/icons/book.png") );
 navToolbarBefore->addWidget( addNewText );
 connect(addNewText, SIGNAL(clicked()), this, SLOT(setText()));

Оформил слот:
Код
C++ (Qt)
void Dialog::setText()
{
   bool ok;
   QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                        tr("User name:"), QLineEdit::Normal,
                                        "", &ok);
}

Компилятор не ругается, но при нажатии на кнопку addNewText диалоговое окно ввода текста не появляется. Что я делаю не так? Благодарен за любую помощь.


Название: Re: Диалоговое окно для ввода текста
Отправлено: lit-uriy от Июнь 30, 2013, 03:57
>>В mainwindow.сс поставил кнопку:
Имя класса, как я понимаю, - MainWindow

А слот почему-то находится в классе Dialog


Название: Re: Диалоговое окно для ввода текста
Отправлено: lit-uriy от Июнь 30, 2013, 04:00
Если ты хочешь чтобы соединение было с объектом класса, то строка
connect(addNewText, SIGNAL(clicked()), this, SLOT(setText()));
должна содержать не this - указатель на объект этого (MainWindow) класса, а на объект класса Dialog (который, разумеется, ещё нужно создать)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 04:39
>>В mainwindow.сс поставил кнопку:
Имя класса, как я понимаю, - MainWindow

А слот почему-то находится в классе Dialog
Спасибо. Я не так давно стал на путь самообучения. Многое недопонимаю. По существу воткнул необходимые части из примера QT. Сейчас повнимательнее разобрался. Немного запутался, но на этот раз окно выскочило.

Значить, что бы оформить новое диалоговое окно, вовсе не нужно открывать класс? Достаточно опубликовать слот и дальше с текстовой строкой можно работать?

Переделал:
В mainwindow.hh прописал кнопку и класс:
Код
C++ (Qt)
class MainWindow: public QMainWindow, public DataCommitter
{
 Q_OBJECT
...
private:
...
 QToolButton * addNewText;
...
private slots:
   void setText();
...
};

В mainwindow.сс поставил кнопку:
Код
C++ (Qt)
 addNewText = new QToolButton ( navToolbarBefore );
 addNewText->setIcon( QIcon (":/icons/book.png") );
 navToolbarBefore->addWidget( addNewText );
 connect(addNewText, SIGNAL(clicked()), this, SLOT(setText()));

Оформил слот:
Код
C++ (Qt)
void MainWindow::setText()
{
   bool ok;
   QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
                                        tr("User name:"), QLineEdit::Normal,
                                        "", &ok);
}

В этот раз все работает. Достаточно корректен код?


Название: Re: Диалоговое окно для ввода текста
Отправлено: lit-uriy от Июнь 30, 2013, 12:07
Значить, что бы оформить новое диалоговое окно, вовсе не нужно открывать класс? Достаточно опубликовать слот и дальше с текстовой строкой можно работать?
С терминологией худо всё (до уровня непонятности).
Отсутствующие в Си++ термины:
 - оформить ... диалоговое окно
 - открывать класс
 - опубликовать слот

Классы и слоты объявляют и описывают (более общий термин - создают).
То что делают (обычно) в h-файлах (заголовочных файлах) называется "объявление".
А в cpp-файлах (файлах реализации), называется "описание" (реализация).

В терминах Qt, дополнительно:
 - слоты соединяют с сигналами.

Диалоговые окна - классы описывающие объект визуального интерфейса пользователя, в Qt они создаются как наследники (на основе) другого класса - QWidget.

Если их классы уже созданы (как в случае с классом QInputDialog, его создали разработчики Qt), то достаточно создать объект (экземпляр)  этого класса.
Если же нужен какой-то уникальный диалог, то нужно предварительно объявить и описать (создать) новый класс диалога.

В этот раз все работает. Достаточно корректен код?
да

П.С. вы используете совершенно не распространённый способ именования файлов.
приняты следующие расширения:
cpp - файл реализации
h - файл заголовочный


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июнь 30, 2013, 12:28
То что делают (обычно) в h-файлах (заголовочных файлах) называется "объявление".
А в cpp-файлах (файлах реализации), называется "описание" (реализация).
Ну можно и так сказать, но лучше

Описания бывают предварительными ("объявления") и полными ("реализация"). Для ф-ции, переменной и класса можно использовать любое число предварительных описаний, но все они должны совпадать. Полное описание должно быть одно - и только одно.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 16:54
За некорректную терминологию извините. За месяц довольно сложно привыкнуть. От части от того, что я многого не допонимаю, от части просто лень с непривычки употреблять правильно. Надеюсь со временем это само собой пройдет.

За помощь спасибо. Вроде более менее разобрался и продвинулся чуть дальше.

Двигаюсь дальше методом проб и ошибок (со справочником и книгой).
Задача была:
- Открыть диалоговое окно и получить имя для нового файла.
- Открыть в каталоге программы новый каталог для нового файла.
- Скопировать с файлов ресурсов файл в новый каталог и переименовать его в соответствии с веденным именем.

Корявенько, но работает.

Код
C++ (Qt)
void MainWindow::nameNewText()
{
 
   bool ok;
   QString text = QInputDialog::getText(this, tr("New Text"),
                                        tr("Text Name:"), QLineEdit::Normal,
                                        "", &ok);
   QString savePath;
   savePath = QDir::currentPath();
   QString rootP(savePath);
   savePath += "/content";
   QDir dir( savePath );
   dir.mkdir(text);
   savePath += "/" + text;
   QDir dir1( savePath );
   QString contPath;
   contPath = text + ".txt.files";
   dir1.mkdir(contPath);
 
   QFile file;
   QString saveFile;
   saveFile = ":/MyText.txt";
   QString contFile;
   contFile = savePath + "/" + text + ".txt";
   file.copy(saveFile, contFile);
   file.open(QIODevice::ReadWrite);
}

Однако файл открывается с атрибутом - только для чтения. Застрял. Если не затруднит, помощи буду рад.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июнь 30, 2013, 17:13
Код
C++ (Qt)
/*
   QFile file;
   QString saveFile;
   saveFile = ":/MyText.txt";
   QString contFile;
   contFile = savePath + "/" + text + ".txt";
   file.copy(saveFile, contFile);
   file.open(QIODevice::ReadWrite);
*/

 
QString destFileName(savePath + "/" + text + ".txt");
QFile::copy(":/MyText.txt", destFileName);
 
QFile destFile(destFileName);
if (destFile,open(QIODevice::ReadWrite)) {
...
 


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 17:36
Igors
Спасибо код аккуратнее выглядит :).
Но не совсем понял, вернее не понял совсем.
Копирую файл MyText.txt в нужный каталог. Переименовываю его в newFile.txt. Дальше пользователь сам его уже будет открывать, для редактирования в любом редакторе. Необходимо, что бы этот текстовый файл не был с атрибутом - только для чтения.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июнь 30, 2013, 18:06
потому что в файле ресурсов все файлы являются только для чтения. атрибуты меняются с помощью bool QFile::setPermissions().


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июнь 30, 2013, 18:11
Копирую файл MyText.txt в нужный каталог. Переименовываю его в newFile.txt.
Так лучше сразу скопировать с нужным именем

Дальше пользователь сам его уже будет открывать, для редактирования в любом редакторе. Необходимо, что бы этот текстовый файл не был с атрибутом - только для чтения.
Тогда
Код
C++ (Qt)
QFile destFile(destFileName);
destFile.setPermissions(destFile.permissions() | QFile::ReadOther | QFile::WriteOther);
 


Название: Re: Диалоговое окно для ввода текста
Отправлено: Old от Июнь 30, 2013, 18:18
Тогда
Зачем создавать объект класса QFile, лучше воспользоваться статическим методом.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 18:26
kambala
Igors

Спасибо за помощь. Понял свою ошибку.

Так лучше сразу скопировать с нужным именем
В общем то я так и делал.

Опять не посчитайте меня ленивым (у нас уже глубокая ночь), попутно. Дальше в скопированном файле надо будет поменять заголовки в тексте (первые три строчки) на полученное имя от пользователя, а проще наверное просто вставить три строчки. С чего начать (какой класс, функции смотреть)? Займусь этим уже завтра (сегодня днем) :).
Спасибо за помощь.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июнь 30, 2013, 18:42
QTextStream


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июнь 30, 2013, 18:50
Дальше в скопированном файле надо будет поменять заголовки в тексте (первые три строчки) на полученное имя от пользователя, а проще наверное просто вставить три строчки. С чего начать (какой класс, функции смотреть)?
Такой операции как "вставка" для файла/потока нет. Поэтому придется грузить файл в контейнер, там менять и писать взад. Смотрите QFile::readAll, QString::split и.т.д


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июнь 30, 2013, 19:01
Спасибо за советы. Будем пробовать.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 07:05
Спасибо за подсказки!
В общем то не сложно оказалось и справился довольно быстро.
Код
C++ (Qt)
   if (destFile.open(QIODevice::WriteOnly | QIODevice::Text))
   {
       QTextStream stream(&destFile1);
       stream.setCodec("UTF-16LE");
       bom ( stream );
 
       stream << "New" + text + "_v1.0\"\n";
       stream << "Content";
 
       stream.flush();
       destFile.close();
   }

В этом случае скорее даже целесообразно не копировать файл с ресурсов, а создавать уже с нужным именем.
Дальше уже творческий процесс :). Осталось снабдить диалоговое окно дополнительными полями ввода и соответственно пополнить шапку файла этой дополнительной информацией.
Подчистить код и ввести хоть какую нибудь простенькую проверку (уже существование каталога/файла с подобным именем).


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 09:39
Усложняется задача для меня. С mainwindow.cpp запустил диалог для ввода одной строки. В конечном итоге не сложно (когда пояснили :)). Теперь если в диалоговом окне необходимо разместить текстовую строку, комбобокс и чекбокс, то мне придется все таки открыть новый newwindow.cpp?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Bepec от Июль 01, 2013, 09:54
:) Страшные у вас задачи :P

В принципе да, нужно новое окно - делайте ещё один виджет :P В принципе в одном cpp/h может быть неограниченное число классов, но по хорошему 1 класс в одном файле :D


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 10:17
:) Страшные у вас задачи :P

В принципе да, нужно новое окно - делайте ещё один виджет :P В принципе в одном cpp/h может быть неограниченное число классов, но по хорошему 1 класс в одном файле :D
В принципе не настолько конечно страшно :), иду ведь от обратного - ковыряю чужую программу. Файлов итак много. И в целом боязно. Ни разу пока не приходилось полностью оформалять класс. Хотелось бы оттянуть этот процесс. Но наверное уже готов к этому, раз надо. Меня больше пугает не то как описать сам виджет, а неизвестность  - как подцепить виджет из mainwindow.cpp ну к той же кнопке, что я подключил предыдущее простое диалоговое окно? Не то, что бы я раньше этого не делал, просто я пользовался готовыми блоками, смотрел уже готовые связи и подгонял, постепенно осознавая, что я делаю. Теперь же все придется делать с нуля :). Конечно страх пройдет после первого подключенного виджета.
Тогда простой вопрос. Все, что мне сейчас надо это просто создать два файла newwindow.cpp, newwindow.h и вперед без страха :)?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Bepec от Июль 01, 2013, 10:18
Возможно.

PS чОрт
Цитировать
чОрный список: Spark
.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 10:22
Bepec
Чего уж по мелочам. Проще ведь всю ветку для новичков в черный список определить.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Bepec от Июль 01, 2013, 10:38
Достоин ответа вопрос, а не спрашивающий. ©

PS те, кто умеют читать и видно, что советы не пролетают мимо них, достойны уважения. И наоборот :)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 17:13
Ok! С новым окном разобрался. Работает.
В нем присутствует ComboBox:
Код
C++ (Qt)
    = new QComboBox();
   newComboBox->addItem("abbr1");
   newComboBox->addItem("abbr2");

Соответственно вытаскиваю строку:
Код
C++ (Qt)
   QString text = newComboBox->currentText();

Каждому итему списка соответствует расшифровка:
abbr1 - abbreviation1
abbr2 - abbreviation2

Необходимо QString text2 присвоить расшифровку.
Конечно могу сделать это через серию Ifов, но хотелось бы сделать это компактнее.
За любую помощь буду благодарен.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 01, 2013, 17:16
Конечно могу сделать это через серию Ifов, но хотелось бы сделать это компактнее.
Широкий выбор QMap, QHash, std::map


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 17:19
Конечно могу сделать это через серию Ifов, но хотелось бы сделать это компактнее.
Широкий выбор QMap, QHash, std::map
Спасибо посмотрю. А чем бы вы воспользовались? Если в списке предполагается пунктов 200-300.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 17:56
Так понял, что QMap не позволяет делать такое QMap<QString, QString> map?


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 01, 2013, 18:17
неправильно понял.

лучше используй хэш — тебе ведь все равно в каком порядке хранятся данные.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 01, 2013, 18:26
неправильно понял.

лучше используй хэш — тебе ведь все равно в каком порядке хранятся данные.
Человеку нужен пример чтобы списать
Код
C++ (Qt)
typedef QMap <QString, QString> TMap;
TMap theMap;
 
// заполняем мапу
theMap["abbr1"] = "abbreviation1";
theMap["abbr2"] = "abbreviation2";
 
// находим полное имя по ключу (shortName)
QString shortName = "abbr1";
QString fullName = theMap.value(shortName, "");
 
// fullName  = "abbreviation1"
// или пустая строка если ключа нет
 


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 19:03
Человеку нужен пример чтобы списать
Вы не справедливы. Я все таки многое делаю самостоятельно и часто достаточно намека, что в правильном направлении ищу. И в общем то свой код написал, но не правильно, поэтому не публикую. Тем более, что ваш работает :). К тому же у нас снова глубокая ночь :). А вопросы потому и не заканчиваются, что много делаю, а не стою на месте. При этом параллельно ищу самостоятельно.
Я рад любой помощи, тем более развернутому ответу. Это очень ускоряет процесс обучения.
Спасибо за пример!

Свой код все таки опубликую, но наверное все переврал:

Код
C++ (Qt)
QHash<QString, QString> hash;
 
hash.insert("abbr1", "abbreviation1");
hash.insert("abbr2", "abbreviation2");
 
QString text = newComboBox->currentText();
 
QString text2 = hash[text];


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 01, 2013, 19:04
пусть человек хоть «букварь» почитает

theMap.value(shortName, "") — а зачем расходовать память на пустую строку если значение по умолчанию QString() «полегче»?

2Spark: твой код правильный, только лучше извлекать значения через value(), а не operator []. в «букваре» прекрасно написано почему и в каких случаях нужно именно [] использовать.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 01, 2013, 19:14
пусть человек хоть «букварь» почитает

theMap.value(shortName, "") — а зачем расходовать память на пустую строку если значение по умолчанию QString() «полегче»?

2Spark: твой код правильный, только лучше извлекать значения через value(), а не operator []. в «букваре» прекрасно написано почему и в каких случаях нужно именно [] использовать.
Спасибо!
По поводу букваря. Очень много информации. Она уже не воспринимается должным образом. А чистый код воспринимается как отдых. Но за помощь спасибо, заставляете двигаться в нужном направлении :). Когда двигаешься в том же направлении, но без поддержки, часто ходишь вокруг да около правильного решения.

P.S. Мое первое самостоятельное окошечко работоспособно, чему безмерно рад :)!
Спасибо всем за помощь!


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 01, 2013, 19:33
2Spark: твой код правильный, только ..
Ну ничего себе "только"  :). Оператор [] возвращает ссылку на имеющееся значение если ключ найден. Однако если такого ключа нет, то сначала будет вставлена новая пара <ключ, значение>, поэтому оператор [] не константый. Это столько же удобно сколько же и опасно. Разумеется наш колобок угодил в расставленные сети - каждое обращение по несуществующему ключу будет вставлять новые элемент - возможно раздувая контейнер до невероятных размеров.

Вы не справедливы. Я все таки многое делаю самостоятельно и часто достаточно намека, что в правильном направлении ищу.
Ну вот не надо тут говорить о каком-то "поиске", "подводить базу" и.т.п. Вы хотите получить практический результат ASAP - в этом нет ничего плохого, просто "творческую личность" не изображайте, выходит очень неубедительно  :)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 02, 2013, 05:29
И тем не менее идем дальше.
Как использовать строку ввода и комбобокс разобрался:
Код
C++ (Qt)
   QString text1 = lineTextVersion->text();
   QString text2 = dictComboBox1->currentText();
 
if (destFile1.open(QIODevice::WriteOnly | QIODevice::Text))
{
       QTextStream stream(&destFile1);
       stream.setCodec("UTF-16LE");
       bom ( stream );
 
       stream << text1 + text2 + "\n";
       stream.flush();
       destFile1.close();
}

А как быть с QTextEdit? В диалоговое окно вставил поле для ввода текста. Каким образом его скопировать в файл?
Буду благодарен любой помощи.


Название: Re: Диалоговое окно для ввода текста
Отправлено: gil9red от Июль 02, 2013, 06:48
Цитировать
А как быть с QTextEdit?

Получаем текст из QTextEdit: toPlainText() и toHtml()  :)

Пример:
Код:
QTextEdit *textEdit = new QTextEdit();
...
QString text = textEdit->toPlainText(); // текст без форматирования
QString html = textEdit->toHtml(); // думаю, тут и так понятно :D


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 02, 2013, 08:01
Цитировать
А как быть с QTextEdit?

Получаем текст из QTextEdit: toPlainText() и toHtml()  :)

Пример:
Код:
QTextEdit *textEdit = new QTextEdit();
...
QString text = textEdit->toPlainText(); // текст без форматирования
QString html = textEdit->toHtml(); // думаю, тут и так понятно :D

Действительно просто, когда подскажут :).
Спасибо!


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 02, 2013, 12:53
Вот такое окошко получилось.
Заголовочный файл mfldialog.hh:
Код
C++ (Qt)
#ifndef MFLDIALOG_HH
#define MFLDIALOG_HH
 
#include <QDialog>
 
class QCheckBox;
class QComboBox;
class QLabel;
class QLineEdit;
class QPushButton;
class QTextEdit;
 
class MainDialog : public QDialog
{
   Q_OBJECT
 
public:
   MainDialog(QWidget *parent = 0);
 
signals:
   void mainNext(const QString &str, Qt::CaseSensitivity cs);
   void mainPrev(const QString &str, Qt::CaseSensitivity cs);
 
private slots:
   void mainClicked();
   void enableMainButton(const QString &text);
 
private:
   QLabel *textName;
   QLineEdit *lineTextName;
   QLabel *textVersion;
   QLineEdit *lineTextVersion;
   QCheckBox *caseCheckBox;
   QComboBox *texComboBox1;
   QComboBox *texComboBox2;
   QTextEdit *atxEdit;
   QPushButton *mainButton;
   QPushButton *closeButton;
};
 
#endif // MFLDIALOG_HH


Файл виджета mfldialog.cc:
Код
C++ (Qt)
#include <QtGui>
 
#include "mfldialog.hh"
 
MainDialog::MainDialog(QWidget *parent)
   : QDialog(parent)
{
   textName = new QLabel(tr("Name:"));
   lineTextName = new QLineEdit;
   textName->setBuddy(lineTextName);
 
   textVersion = new QLabel(tr("Version:"));
   lineTextVersion = new QLineEdit;
   textVersion->setBuddy(lineTextVersion);
 
   atxEdit = new QTextEdit;
 
   caseCheckBox = new QCheckBox(tr("Add text"));
 
   texComboBox1 = new QComboBox();
   texComboBox1->addItem("Abbr1");
   texComboBox1->addItem("Abbr2");
 
   texComboBox2 = new QComboBox();
   texComboBox2->addItem("Abbr1");
   texComboBox2->addItem("Abbr2");
 
   mainButton = new QPushButton(tr("Add"));
   mainButton->setDefault(true);
   mainButton->setEnabled(true);
 
   closeButton = new QPushButton(tr("Close"));
 
   connect(lineTextName, SIGNAL(textChanged(const QString &)),
           this, SLOT(enabledMainButton(const QString &)));
   connect(mainButton, SIGNAL(clicked()),
           this, SLOT(mainClicked()));
   connect(closeButton, SIGNAL(clicked()),
           this, SLOT(close()));
 
   QHBoxLayout *topLeftLayout1 = new QHBoxLayout;
   topLeftLayout1->addWidget(textName);
   topLeftLayout1->addWidget(lineTextName);
 
   QHBoxLayout *topLeftLayout2 = new QHBoxLayout;
   topLeftLayout2->addWidget(textVersion);
   topLeftLayout2->addWidget(lineTextVersion);
 
   QHBoxLayout *topLeftLayout3 = new QHBoxLayout;
   topLeftLayout3->addWidget(texComboBox1);
   topLeftLayout3->addWidget(texComboBox2);
 
   QVBoxLayout *leftLayout = new QVBoxLayout;
   leftLayout->addLayout(topLeftLayout1);
   leftLayout->addLayout(topLeftLayout2);
   leftLayout->addLayout(topLeftLayout3);
   leftLayout->addWidget(atxEdit);
   leftLayout->addWidget(caseCheckBox);
 
   QVBoxLayout *rightLayout = new QVBoxLayout;
   rightLayout->addWidget(mainButton);
   rightLayout->addWidget(closeButton);
   rightLayout->addStretch();
 
   QHBoxLayout *mainLayout = new QHBoxLayout;
   mainLayout->addLayout(leftLayout);
   mainLayout->addLayout(rightLayout);
   setLayout(mainLayout);
 
   setWindowTitle(tr("New Text"));
   setFixedHeight(sizeHint().height());
}
 
void MainDialog::mainClicked()
{
   QString text = lineTextName->text();
   QString text2 = lineTextVersion->text();
   QString text3 = texComboBox1->currentText();
   QString text4 = texComboBox2->currentText();
   QString text5 = atxEdit->toPlainText();
 
   QString savePath;
   savePath = QDir::currentPath();
   savePath += "/folder";
   QDir dir( savePath );
   QString savePat = text3 + "-" + text4 + "_" + text;
   dir.mkdir(savePat);
   savePath += "/" + savePat;
   QDir dir1( savePath );
   QString texPath;
   texPath = text + ".mfl.files";
   dir1.mkdir(texPath);
   QString stylePath;
   stylePath = savePath + "/" + texPath;
   QDir dir2( stylePath );
   dir2.mkdir( "dir" );
 
   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);
 
   QHash<QString, QString> hash;
 
   hash.insert("Abbr1", "Abbreviation1");
   hash.insert("Abbr2", "Abbreviation2");
 
   QString fullName1 = hash.value(text3);
   QString fullName2 = hash.value(text4);
 
   if (destFile1.open(QIODevice::WriteOnly | QIODevice::Text))
   {
       QTextStream stream(&destFile1);
       stream.setCodec("UTF-16LE");
       bom ( stream );
 
       stream << "Name"" + text + "_v" + text2 + " (" + text3 + "-" + text4 + ")\"\n";
       stream << fullName1 + "\"\n";
       stream << fullName2 + "\"\r\n";
       stream << "Test\n\t";
       stream << "Test";
 
       stream.flush();
       destFile1.close();
   }    
   if (destFile2.open(QIODevice::WriteOnly | QIODevice::Text))
   {
       QTextStream stream(&destFile2);
       stream.setCodec("UTF-16LE");
       bom ( stream );
 
       stream << "Abbreviations for " + text + " (" + text3 + "-" + text4 + ")\"\n";
       stream << fullName1 + "\"\n";
       stream << fullName1 + "\"\r\n";
 
       stream.flush();
       destFile1.close();
   }
   if (destFile3.open(QIODevice::WriteOnly | QIODevice::Text))
   {
       QTextStream stream(&destFile3);
       stream.setCodec("UTF-16LE");
       bom ( stream );
 
       stream << text5;
 
       stream.flush();
       destFile1.close();
   }
}
 
void MainDialog::enableMainButton(const QString &text)
{
    mainButton->setEnabled(!text.isEmpty());
}

Доступ через maiwindow.cc:
Код
C++ (Qt)
void MainWindow::nameNewText()
{
   MainDialog *dialog = new MainDialog;
   dialog->show();
}

Вроде как работает. Беглым взглядом может кто просмотрит, что не так?
Из запланированного на решение - закрытие окна при нажатии кнопки add и проверка на уже существующий каталог с таким именем.

А на сегодня необходимо научиться еще одному приему :). Есть конфиг config.cc. Необходимо подцепить его к моему новому окошку. Как это правильно делается, как задекларировать?
Пока самостоятельно изучаю этот момент, попытки были, но пока неудачные. Буду рад если найдутся добрые люди помочь.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 03, 2013, 07:48
Тем не менее удалось самостоятельно решить вопрос с подключением информации из конфиг. файла в свой класс. Правда потратил пару дней на это. С виду ничего сложного, но пришлось включать метод проб и ошибок. Почему то информации по этому поводу не удалось найти.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 03, 2013, 11:50
не мог #include "config.hh" написать? а всё от незнания языка.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 03, 2013, 15:43
не мог #include "config.hh" написать? а всё от незнания языка.
В общем то все посложнее. Но вы правы. Конечно все от незнания языка. От чего же еще?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 03, 2013, 15:52
И опять между делом, пока изучается материал, задам вопрос. В листинге видно. Создаются каталоги. Как организовать проверку (что бы не затереть информацию), если каталог уже существует?
Рад любой помощи.

P.S. Ok! Не сложно оказалось. if (!dir.exists())


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 05, 2013, 13:41
Опять застрял :).
В maiwindow.hh
Код
C++ (Qt)
public slots:
 
 void on_rescanText_triggered();

Слот подобного вида в mfldialog.cc не работает:
Код
C++ (Qt)
   connect(findButton, SIGNAL(clicked()),
           this, SLOT(on_rescanText_triggered()));

В mfldialog.hh прописано:
Код
C++ (Qt)
#include "mainwindow.hh"

Что делаю не так?
Рад любой помощи.



Или такой вариант в maiwindo.cc это рабоатает:
Код
C++ (Qt)
void MainWindow::nameNewText()
{
   MainDialog *dialog = new MainDialog;
   dialog->show();
   on_rescanText_triggered();
}

В mfldialog.cc on_rescanText_triggered(); не срабатывает.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 05, 2013, 16:08
а с чего ты взял, что он должен срабатывать в классе, который никакого отношения не имеет к MainWindow? пойди почитай про сигналы/слоты еще раз.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 05, 2013, 16:18
а с чего ты взял, что он должен срабатывать в классе, который никакого отношения не имеет к MainWindow? пойди почитай про сигналы/слоты еще раз.
Спасибо. Почитаю конечно. Разве он не должен сработать если я его заявил в Паблик слот?
Хотя бы намекните, что слот это можно использовать, если действовать правильно :). Или это не возможно совсем.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 06, 2013, 07:42
Ok! Перечитал, полезно :). Однако не намного легче в плане поставленной задачи. Ясно, что сигнал надо подключить к слоту объекта (MainWindow). Но как это сделать в данном случае не ясно и возможно ли это вообще сделать?
Или стоит вообще другим путем решать эту задачу?


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 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();
}


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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, а затем уже срабатывает это  слот. Это наверное легче организовать, хотя пока тоже не представляю. Но даже если это решение у меня получится, то плохой выход (временный, пока не наберусь опыта и сделаю так как надо).


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 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()


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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? Извините просто я слишком мало еще знаю, что бы понять советы.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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
Однако порядок иной. Как лучше сделать?


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 08, 2013, 11:45
о циклах и массивах никогда не слышал?

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

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


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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)'


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 08, 2013, 19:11
command3.replace( "%EDIT%", "" + destFileName3 + "" ); — зачем нужна магия в виде добавления пустых строк? это же бессмысленно.
Действительно бессмысленно. Но я вовсе не собирался добавлять пустые строки. Добавлял кавычки. Просто брал с примера, а там вообще тройные кавычки. Переменную проверил, обрамление destFileName3 шло двойными кавычками, ну я и подумал, что одни лишние. Убрал, вывел переменную, с виду как надо, так и оставил. Оказалось - совсем лишние (в cfg переменной они уже имеются). В общем глупо, по невнимательности.
Спасибо!


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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();
Спасибо за наводку.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 09, 2013, 17:27
одной переменной QEventLoop нельзя обойтись что ли?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 09, 2013, 17:48
одной переменной QEventLoop нельзя обойтись что ли?
Можно :).


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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);
   }

Ну как смог так и сделал. Работает. Может список директорий вытаскивается проще или вообще это надо было делать как то иначе?
И второе, не получается, что бы автоматически обновлялся список комбобокса при добавлении нового проекта.
Так же если в директории случайные файлы, то они то же попадают в список комбобокаса, что конечно же плохо.
Рад любой помощи в решении этих вопросов.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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);
      }
   }
 
   }

Остается вопрос. На сколько практично решение. Или надо было делать как то иначе?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Alex Custov от Июль 10, 2013, 12:07
зачем начинать цикл с 2? Подозреваю, чтобы убрать . и ..? Для этого есть флаг.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 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);
   }
 
   }
Сейчас разберусь с флагом.
А вытащить список директорий иным способом нельзя? Нет волшебной функции?


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 10, 2013, 12:33
Цитировать
А вытащить список директорий иным способом нельзя? Нет волшебной функции?
ты и так используешь волшебную метод entryInfoList(), но можно пойти еще дальше и задать фильтр названий прямо в методе первым параметром, а параметры, чьи значения совпадают со значениями по умолчанию, можно и не передавать (QDir::NoSort)
Код
C++ (Qt)
dirComboBox3 = new QComboBox();
я заметил, что ты все виджеты создаешь без родителя (параметр конструктора). это не очень хороший подход. и название переменной тоже оставляет желать лучшего.
В конце создания нового проекта перерисовываю комбобокс. Случайные пункты с именами файлов убрал регэкспом:
копипаста — это плохо. к тому же, если ты просто хочешь, чтобы новые элементы добавлялись в комбобокс в алфавитном порядке, задай dirComboBox3->setInsertPolicy(QComboBox::InsertAlphabetically) и добавляй новый проект просто в виде dirComboBox3->addItem(newProjectPath);
Код
C++ (Qt)
fPath.remove(QRegExp("/*.*_"));
что это за магия вообще? как регулярное выражение оно написано ужасно и непонятно.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 12:55
Код
C++ (Qt)
fPath.remove(QRegExp("/*.*_"));
что это за магия вообще? как регулярное выражение оно написано ужасно и непонятно.
Много опыта не имел с регулярными выражениями.
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Как бы вы поступили если необходимо оставить abbr1_abbr2_projFolder?

На счет имен. Это временно. Пока не выработал в сознании стройной системы. Как только руки дойдут, так только пройдусь и переименую должным образом.

Остальное сейчас буду осознавать :) и пытаться оптимизировать.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 13:12
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Как бы вы поступили если необходимо оставить abbr1_abbr2_projFolder?
Код
C++ (Qt)
int pos = str.lastIndexOf('/');
if (pos >= 0)
str = str.right(str.size() - pos - 1);
 


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 13:19
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Как бы вы поступили если необходимо оставить abbr1_abbr2_projFolder?
Код
C++ (Qt)
int pos = str.lastIndexOf('/');
if (pos >= 0)
str = str.right(str.size() - pos - 1);
 
Однако, этот способ не выглядит лаконичным и более красивым. Но может у него есть преимущества?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 13:28
Прошу прощения. С пути - C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Оставить необходимо projFolder.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 13:56
Однако, этот способ не выглядит лаконичным и более красивым. Но может у него есть преимущества?
Мне кажется не очень грамотным запрягать QRegExp если есть гораздо более простой способ. А вот сделать лаконичнее - мысль хорошая. Я бы добавил такой хедерок (напр MyStr.h)
Код
C++ (Qt)
#ifndef MYSTR_H
#define MYSTR_H
 
#include <QString>
#include <QDir>
 
namespace MyStr {
 
inline QString AfterLast( const QString & src, QChar ch )
{
 return str.mid(str.lastIndexOf(ch) + 1);
}
 
inline QString Path2FileName( const QString & path )
{
 return AfterLast(path, QDir::seperator());
}
 
} // namespace
 
#endif    // MYSTR_H
 
И по мере необходимости дописывл туда нужные ф-ции. А их будет много - даже при работе с именами файлов


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 13:58
Прошу прощения. С пути - C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Оставить необходимо projFolder.
Вот и хорошо, проаерим подход который я только что рекомендовал
Код
C++ (Qt)
using namespace MyStr;
...
str = AfterLast(Path2FileName(str), '_');
 


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 10, 2013, 14:19
Как бы вы поступили если необходимо оставить abbr1_abbr2_projFolder?
в общем случае я бы использовал QFileInfo. вот ты вроде ж использовал QDir, а описание класса внимательно не читал?

2Igors: короче будет str.mid(pos) или вовсе str.mid(str.lastIndexOf(ch)) ;) да и с QDir::seperator() сядем в лужу если под виндой пути хранятся через прямой слэш как в данном случае.

проще всего тут, на мой взгляд, будет
Код
C++ (Qt)
fPath = MyStr::AfterLast(fPath, '_')
ну или прямо в коде написать
Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 14:31
Сейчас начнет голова кругом от информации :). Но по порядку.
копипаста — это плохо. к тому же, если ты просто хочешь, чтобы новые элементы добавлялись в комбобокс в алфавитном порядке, задай dirComboBox3->setInsertPolicy(QComboBox::InsertAlphabetically) и добавляй новый проект просто в виде dirComboBox3->addItem(newProjectPath);

Так действительно компактнее и проще.
Код
C++ (Qt)
#include <QtGui>
 
#include "mfldialog.hh"
 
MainDialog::MainDialog( Config::Class &cfg_, QWidget *parent ) :
   QDialog( parent ),
   cfg(cfg_)
{
...
...
   dirComboBox3 = new QComboBox();
   dirComboBox3->setInsertPolicy(QComboBox::InsertAlphabetically);
   QDir dir( cfg.projectTextionaryFolder );
   QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
   for (int i = 0; i < list.size(); ++i)
   {
      QFileInfo fInfo = list.at(i);
      QString fPath = fInfo.filePath();
      fPath.remove(QRegExp("/*.*_"));
      dirComboBox3->addItem(fPath);
   }
...
...
void FindDialog::findClicked()
{
   QString text = lineTextName->text();
   QString text2 = lineTextVersion->text();
   QString text3 = txtComboBox1->currentText();
   QString text4 = txtComboBox2->currentText();
   QString text5 = atxEdit->toPlainText();
 
   dirComboBox3->addItem(text);
...

Но вот в алфавитном порядке не выстраивается. Что не так делаю?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 15:31
В алфавитном порядке не получается выстроить.

Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));
Оставляет подчеркивание.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 16:06
2Igors: короче будет str.mid(pos) или вовсе str.mid(str.lastIndexOf(ch)) ;) да и с QDir::seperator() сядем в лужу если под виндой пути хранятся через прямой слэш как в данном случае.
Ну то надо по месту решать какие слеши. Да, mid короче, но 1 надо прибавить
Код
C++ (Qt)
mid(fPath.lastIndexOf('_') + 1)
 
ну или прямо в коде написать
Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));
А если такой путь
Цитировать
C:/Program Files (x86)/myDir/content/PROJECT_1/projFolder
Я понял что надо найти суффикс именно в имени файла


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 16:13
Я понял что надо найти суффикс именно в имени файла
Есть каталог:
C:/Program Files (x86)/myDir/content/PROJECT/
В нем создаются проектные каталоги типа (файлов нет):
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Оставить надо только projFolder


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 16:25
Есть каталог:
C:/Program Files (x86)/myDir/content/PROJECT/
В нем создаются проектные каталоги типа (файлов нет):
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Оставить надо только projFolder
Не суть - важно что в последнем имени отделенном слешем


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 16:35
Есть каталог:
C:/Program Files (x86)/myDir/content/PROJECT/
В нем создаются проектные каталоги типа (файлов нет):
C:/Program Files (x86)/myDir/content/PROJECT/abbr1_abbr2_projFolder
Оставить надо только projFolder
Не суть - важно что в последнем имени отделенном слешем
ну в общем суффикс надо оставить.
Вариант
Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));
оставляет с подчеркиванием _projFolder. Подчеркивание не нужно.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 16:43
ну в общем суффикс надо оставить.
Вариант
Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));
оставляет с подчеркиванием _projFolder. Подчеркивание не нужно.
Обе ошибки уже обсуждались выше. Читайте


Название: Re: Диалоговое окно для ввода текста
Отправлено: thechicho от Июль 10, 2013, 17:48
split("/").takeLast().split("_").takeLast();


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 17:58
Нет в жизни счастья :).
В общем не работает setInsertPolicy. Оставлю до лучших времен разбор и остановлюсь на рабочем варианте с пересканированием всех проектов.


Название: Re: Диалоговое окно для ввода текста
Отправлено: kambala от Июль 10, 2013, 18:03
Вариант
Код
C++ (Qt)
fPath = fPath.mid(fPath.lastIndexOf('_'));
оставляет с подчеркиванием _projFolder. Подчеркивание не нужно.
ты совсем что ли не понимаешь что в коде происходит? в таком случае можно начать с чтения описания методов.
Нет в жизни счастья :).
В общем не работает setInsertPolicy
странно


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 18:15
ты совсем что ли не понимаешь что в коде происходит? в таком случае можно начать с чтения описания методов.
Не стоит так резко. Я много не понимаю. Тем не менее продолжаю обучение. В данном случае я на код не смотрел (конечно же смогу и сам поправить), а просто вставил, поскольку считал, что ясно пояснил ситуацию. Я ведь писал, что решаю последовательно задачи. А накидали их достаточно, поскольку из рабочего кода сейчас я получил не рабочий. Вернее не рабочий должным образом. Обучение с нуля начал полтора месяца назад (ни C++ ни QT тем более...). Поставьте себя на мое место и вспомните, как ваше обучение начиналось.
Я понимаю, что тяжело отвечать на однотипные вопросы не выходя из себя, но все таки надо быть терпимее.
А за помощь спасибо.
Ладно хватит вас мучить на сегодня :).
У нас уже третий час ночи.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 18:25
Я понимаю, что тяжело отвечать на однотипные вопросы не выходя из себя, но все таки надо быть терпимее.
"Сначала опустит до своего уровня, потом раздавит опытом"  :)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 10, 2013, 18:30
Я понимаю, что тяжело отвечать на однотипные вопросы не выходя из себя, но все таки надо быть терпимее.
"Сначала опустит до своего уровня, потом раздавит опытом"  :)
Однако у меня не плохо получается и на этом уровне. И может не стоит начинать очередной виток флуда? Я ведь вас не спрашиваю как мне стоит обучаться. И поверьте в этом я кое, что понимаю.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Bepec от Июль 10, 2013, 18:38
Ггг.
BEGIN:;
Задаёт вопрос, получает блок кода, вставляет, ни черта не понимает.
GOTO BEGIN;


Название: Re: Диалоговое окно для ввода текста
Отправлено: Igors от Июль 10, 2013, 18:41
Однако у меня не плохо получается и на этом уровне. И может не стоит начинать очередной виток флуда?
Так вот и не начинайте. Гоаорите о деле, о решаемых задачах. Увидели раздраженный ответ - не реагируйте, продолжайте говорить о программировании. А ото каких высот Вы уже достигли, да как движется процесс, да как Вы это оцениваете - это никому не интересно, не захламляйте форум своими личными переживаниями  :)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Alex Custov от Июль 10, 2013, 20:01
Обучение с нуля начал полтора месяца назад (ни C++ ни QT тем более...). Поставьте себя на мое место и вспомните, как ваше обучение начиналось.

Учи сперва С++, а Qt пока отложи подальше.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Bepec от Июль 10, 2013, 20:23
Моё обучение начиналось с "Надо разработать программу по протоколу, из описание которого лишь работающая программа". И форумов у меня тогда не было :D Была книга С++   и установленная Qt 4.7.2 :)


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 11, 2013, 15:52
Ok! Надеюсь все желающие высказали свою точку зрения. Тем не менее продолжаю обучение.
Вроде все функционирует как надо, но есть небольшой нюанс. Пока QTextStream наполняет построчно файлы, открываются файлы проекта в текстовом редакторе. И редактор ругается, что текст модифицирован иной программой. Это регулировать так же через временную задержку или есть способ ставить на очередь?


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 13, 2013, 21:29
Код
C++ (Qt)
void MainWindow::slideshowOn()
{
...
...
       do
       {
          ...
 
           popupWin->slideFor( trimmedStr );
 
           QEventLoop loop;
           QTimer::singleShot(5000, &loop, SLOT(quit()));
           loop.exec();
 
       } while( !fileStream.atEnd() && itemList.size() < (int)spisok.getMaxSize() );
...
...
}
 
void MainWindow::slideshowOff()
{
 
}

Организовал слайдшоу. Слот slideshowOn инициализирует окно слайдшоу. Цикл выводит поочередно слайды.
Слот slideshowOff должен остановить слайдшоу или как то по другому это организовывается? В общем не получается. Как правильно это сделать?
Рад любой помощи!


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 14, 2013, 12:03
Пока выкрутился так:
Код
C++ (Qt)
void MainWindow::slideshowOn(bool on)
{
   cfg.preferences.slideOff = false;
   if(!on)return;
...
...
       do
       {
           ...
 
           if(cfg.preferences.slideshowOff)break;
 
           popupWin->slideFor( trimmedStr );
 
           QEventLoop loop;
           QTimer::singleShot(5000, &loop, SLOT(quit()));
           loop.exec();          
 
       } while( !fileStream.atEnd() && itemList.size() < (int)spisok.getMaxSize() );
 
...
...
}
 
void MainWindow::slideshowOff()
{
   cfg.preferences.slideOff= true;
}
Не хотелось бы задействовать конфиг файл. Ясно, что нужна простая булева переменная, но не получается, что бы slideshowOn(bool on) видел ее.


Название: Re: Диалоговое окно для ввода текста
Отправлено: Spark от Июль 14, 2013, 12:26
Ok! Получилось.
Но может профи подскажут, как организовать паузу?