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

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #30 : Июль 01, 2013, 19:04 »

пусть человек хоть «букварь» почитает

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

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

Изучением 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
Гость
« Ответ #31 : Июль 01, 2013, 19:14 »

пусть человек хоть «букварь» почитает

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

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

P.S. Мое первое самостоятельное окошечко работоспособно, чему безмерно рад Улыбающийся!
Спасибо всем за помощь!
« Последнее редактирование: Июль 01, 2013, 19:18 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Июль 01, 2013, 19:33 »

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

Вы не справедливы. Я все таки многое делаю самостоятельно и часто достаточно намека, что в правильном направлении ищу.
Ну вот не надо тут говорить о каком-то "поиске", "подводить базу" и.т.п. Вы хотите получить практический результат ASAP - в этом нет ничего плохого, просто "творческую личность" не изображайте, выходит очень неубедительно  Улыбающийся
Записан
Spark
Гость
« Ответ #33 : Июль 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? В диалоговое окно вставил поле для ввода текста. Каким образом его скопировать в файл?
Буду благодарен любой помощи.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #34 : Июль 02, 2013, 06:48 »

Цитировать
А как быть с QTextEdit?

Получаем текст из QTextEdit: toPlainText() и toHtml()  Улыбающийся

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

Spark
Гость
« Ответ #35 : Июль 02, 2013, 08:01 »

Цитировать
А как быть с QTextEdit?

Получаем текст из QTextEdit: toPlainText() и toHtml()  Улыбающийся

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

Действительно просто, когда подскажут Улыбающийся.
Спасибо!
Записан
Spark
Гость
« Ответ #36 : Июль 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. Необходимо подцепить его к моему новому окошку. Как это правильно делается, как задекларировать?
Пока самостоятельно изучаю этот момент, попытки были, но пока неудачные. Буду рад если найдутся добрые люди помочь.
Записан
Spark
Гость
« Ответ #37 : Июль 03, 2013, 07:48 »

Тем не менее удалось самостоятельно решить вопрос с подключением информации из конфиг. файла в свой класс. Правда потратил пару дней на это. С виду ничего сложного, но пришлось включать метод проб и ошибок. Почему то информации по этому поводу не удалось найти.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

не мог #include "config.hh" написать? а всё от незнания языка.
Записан

Изучением 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
Гость
« Ответ #39 : Июль 03, 2013, 15:43 »

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

И опять между делом, пока изучается материал, задам вопрос. В листинге видно. Создаются каталоги. Как организовать проверку (что бы не затереть информацию), если каталог уже существует?
Рад любой помощи.

P.S. Ok! Не сложно оказалось. if (!dir.exists())
« Последнее редактирование: Июль 03, 2013, 17:26 от Spark » Записан
Spark
Гость
« Ответ #41 : Июль 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(); не срабатывает.
« Последнее редактирование: Июль 05, 2013, 15:25 от Spark » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

а с чего ты взял, что он должен срабатывать в классе, который никакого отношения не имеет к MainWindow? пойди почитай про сигналы/слоты еще раз.
Записан

Изучением 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
Гость
« Ответ #43 : Июль 05, 2013, 16:18 »

а с чего ты взял, что он должен срабатывать в классе, который никакого отношения не имеет к MainWindow? пойди почитай про сигналы/слоты еще раз.
Спасибо. Почитаю конечно. Разве он не должен сработать если я его заявил в Паблик слот?
Хотя бы намекните, что слот это можно использовать, если действовать правильно Улыбающийся. Или это не возможно совсем.
Записан
Spark
Гость
« Ответ #44 : Июль 06, 2013, 07:42 »

Ok! Перечитал, полезно Улыбающийся. Однако не намного легче в плане поставленной задачи. Ясно, что сигнал надо подключить к слоту объекта (MainWindow). Но как это сделать в данном случае не ясно и возможно ли это вообще сделать?
Или стоит вообще другим путем решать эту задачу?
« Последнее редактирование: Июль 06, 2013, 07:44 от Spark » Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


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