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

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

Страниц: [1] 2 3 ... 6   Вниз
  Печать  
Автор Тема: Диалоговое окно для ввода текста  (Прочитано 36250 раз)
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 диалоговое окно ввода текста не появляется. Что я делаю не так? Благодарен за любую помощь.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Июнь 30, 2013, 03:57 »

>>В mainwindow.сс поставил кнопку:
Имя класса, как я понимаю, - MainWindow

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

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

Если ты хочешь чтобы соединение было с объектом класса, то строка
connect(addNewText, SIGNAL(clicked()), this, SLOT(setText()));
должна содержать не this - указатель на объект этого (MainWindow) класса, а на объект класса Dialog (который, разумеется, ещё нужно создать)
Записан

Юра.
Spark
Гость
« Ответ #3 : Июнь 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);
}

В этот раз все работает. Достаточно корректен код?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


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

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

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

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

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

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

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

П.С. вы используете совершенно не распространённый способ именования файлов.
приняты следующие расширения:
cpp - файл реализации
h - файл заголовочный
« Последнее редактирование: Июнь 30, 2013, 12:10 от lit-uriy » Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 30, 2013, 12:28 »

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

Описания бывают предварительными ("объявления") и полными ("реализация"). Для ф-ции, переменной и класса можно использовать любое число предварительных описаний, но все они должны совпадать. Полное описание должно быть одно - и только одно.
Записан
Spark
Гость
« Ответ #6 : Июнь 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);
}

Однако файл открывается с атрибутом - только для чтения. Застрял. Если не затруднит, помощи буду рад.
« Последнее редактирование: Июнь 30, 2013, 16:57 от Spark » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 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)) {
...
 
Записан
Spark
Гость
« Ответ #8 : Июнь 30, 2013, 17:36 »

Igors
Спасибо код аккуратнее выглядит Улыбающийся.
Но не совсем понял, вернее не понял совсем.
Копирую файл MyText.txt в нужный каталог. Переименовываю его в newFile.txt. Дальше пользователь сам его уже будет открывать, для редактирования в любом редакторе. Необходимо, что бы этот текстовый файл не был с атрибутом - только для чтения.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июнь 30, 2013, 18:06 »

потому что в файле ресурсов все файлы являются только для чтения. атрибуты меняются с помощью bool QFile::setPermissions().
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 30, 2013, 18:11 »

Копирую файл MyText.txt в нужный каталог. Переименовываю его в newFile.txt.
Так лучше сразу скопировать с нужным именем

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

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июнь 30, 2013, 18:18 »

Тогда
Зачем создавать объект класса QFile, лучше воспользоваться статическим методом.
Записан
Spark
Гость
« Ответ #12 : Июнь 30, 2013, 18:26 »

kambala
Igors

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

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

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

Сообщений: 4747



Просмотр профиля WWW
« Ответ #13 : Июнь 30, 2013, 18:42 »

QTextStream
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 30, 2013, 18:50 »

Дальше в скопированном файле надо будет поменять заголовки в тексте (первые три строчки) на полученное имя от пользователя, а проще наверное просто вставить три строчки. С чего начать (какой класс, функции смотреть)?
Такой операции как "вставка" для файла/потока нет. Поэтому придется грузить файл в контейнер, там менять и писать взад. Смотрите QFile::readAll, QString::split и.т.д
Записан
Страниц: [1] 2 3 ... 6   Вверх
  Печать  
 
Перейти в:  


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