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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 47 48 [49] 50
721  Qt / Пользовательский интерфейс (GUI) / Re: Передача данных из модального окна в основное через слот. Неполучается. : Июль 23, 2008, 13:11
Ну даже если убрать команды

Код:
 // Закрывается окно
 this->setAttribute(Qt::WA_DeleteOnClose);
 this->close();

то все равно слот не вызывается и данные не передаются.


Ваше решение впринципе подходит, но хотелось бы понять почему не работает то что в первом посте написано. А то я так никогда и не пойму, как работает механизм сигнал-слот.
722  Qt / Пользовательский интерфейс (GUI) / Передача данных из модального окна в основное через слот. Неполучается. : Июль 23, 2008, 12:08
Здравствуйте!


Есть простая задача - нужно из основного окна открыть небольшое модальное окно, ввести в нем пару строк, при нажатии OK передать данные в основное окно и закрыть это модальное окно.

Я делаю так. Вот код основного окна.

mainwindow.h
Код:
class mainwindow : public QMainWindow, public Ui::MainWindow
{
 ...
 private slots:
  // Слот, в котором вызывается модальное окно (вызывается из контекстного меню)
  void recordview_add_new_context(void);
 public slots:
  // Слот для приема данных из модального окна
  void recordview_add_new(QString name, QString text);
 ...
};

mainwindow.cpp
Код:
...
// Слот для открытия окошка добавления новой записи в таблицу
void mainwindow::recordview_add_new_context(void)
{
 qDebug() << "In slot recordview_add_new_context()";

 addnewrecord addnewrecordwin;

 connect(&addnewrecordwin, SIGNAL(signal_recordview_add_new(QString name, QString text)),
         this,             SLOT(recordview_add_new(QString name, QString text)));

 addnewrecordwin.exec();
}


// Слот добавления новой записи в таблицу коннечых записей
void mainwindow::recordview_add_new(QString name, QString text)
{
 qDebug() << "In slot recordview_add_new()";
   
 // Получение ссылки на модель таблицы конечных записей
 recordtablemodel *model=(recordtablemodel *)recordview->model();

 // Вставка данных в модель
 model->insert_new_record(name,text);
}
...


А вот код модального окна

addnewrecord.h
Код:
class addnewrecord : public QDialog, public Ui::addnewrecordform
{
Q_OBJECT

private slots:
 // Слот, вызыващийся при нажатии Ok
 void accept(void);

signals:
 // Сигнл для пересылки введенных данных.
 // Реалиацию сигнала делать не нужно, надо только описать его, и затем вызвать через emit
 void signal_recordview_add_new(QString name, QString text);

public:
 // Конструктор окна
 addnewrecord( QWidget * parent = 0, Qt::WFlags f = 0 );
};


addnewrecord.cpp
Код:
addnewrecord::addnewrecord( QWidget * parent, Qt::WFlags f) : QDialog(parent, f)
{
 setupUi(this);
}

void addnewrecord::accept(void)
{
 qDebug() << "In slot accept class addnewrecord";
 
 // Отправляются введенные пользователем данные
 emit signal_recordview_add_new(recordname->text(),recordtext->toHtml());
 
 // Закрывается окно
 this->setAttribute(Qt::WA_DeleteOnClose);
 this->close();
}

При запуске программы модальное окно открывается, можно ввести данные, при нажатии на OK появляется debug-строка "In slot accept class addnewrecord". И дальше должна появиться строка "In slot recordview_add_new()", которая бы свидетельствовала что данные приняты. Но она не появляется, т.е. данные не передаются в слот recordview_add_new().

Вопрос - что не так сделано, и как можно исправить?
723  Qt / Model-View (MV) / Re: QListView и его модель - не показываются новые записи после добавления в модель. : Июль 20, 2008, 15:22
Во, заработало через beginInsertRows()...endInsertRows(). А я то думал что dataChanged() можно использовать при добавлении данных. Ну типа строки небыло, потом она появилась, значит произошло изменение и его надо показать...

А вот вопрос по последней строчке "delete this;". Это для чего надо? Зачем удалять текущий объект, как дальше тогда работать? Или это йумар такой?
724  Qt / Model-View (MV) / Re: QListView и его модель - не показываются новые записи после добавления в модель. : Июль 20, 2008, 14:42
Еще момент - поставил дебаг вывод (и выяснил что нумерация начинается с нуля). Теперь код эмита сигнала выглядит так

Код:
  QModelIndex index=this->index(table.size()-1,0,QModelIndex());
  qDebug() << this->data(index,Qt::DisplayRole);
  if(index.isValid())
  {
    qDebug() << "Emit dataChanged()";
    emit dataChanged(index,index); // Посылается сигнал что данные были изменены
  }
  else
   qDebug() << "Error calculate index in recordtablemodel";


В ответ получаю

Код:
QVariant(QString, "New record in table")
Emit dataChanged()

то есть индекс модели для новой добавленой строки вычисляется правильно. Но почему тогда эмит сигнала не обновляет вид, и новой строки не видно?
725  Qt / Model-View (MV) / Re: QListView и его модель - не показываются новые записи после добавления в модель. : Июль 20, 2008, 14:22
Спасибо за ответы. У меня действительно как и у товарища Horta самодельная модель, и я не совсем понимаю как генерировать сигнал, что данные изменились, с нужными индексами модели.

Точнее, проблема в вычислении индексов модели, непойму как делать надо.

Вот код метода модели, о котором спрашивал Константин. Я его доработал чтоб он эмитил сигнал, но вид всеравно не обновляется.

В заголовке у класса recordtablemodel есть такие определения

Код:
    typedef QMap<QString, QString> reclintype; // Тип для одной строки таблицы
    QList< reclintype > table; // Сама таблица

А вот реализация добавления новой записи

Код:
// Добавление в конец списка новой записи
void recordtablemodel::insert_new_record(QString name, QString text)
{
  // Создается и заполняется объект одной записи
  reclintype tmpline;
  tmpline["name"]=name;
  tmpline["text"]=text;
     
  // Данная запись размещается в таблице записей, которую хранит модель
  table << tmpline;
 
  // Вычисление индекса новой добавленой строки
  QModelIndex index=this->index(table.size(),1);
  if(index.isValid())
   emit dataChanged(index,index); // Посылается сигнал что данные были изменены
  else
   qDebug() << "Error calculate index in recordtablemodel"; 
}


Не понял правда, как идет нумерация строк и колонок, с нуля или с единицы. Но если использовать конструкцию index(table.size(),1) - то получаем ошибку Error calculate index in recordtablemodel. А если использовать index(table.size()-1,0), то ошибки не возникает, но новая строка не появляется...

Меня вообще беспокоит конструкция

Код:
  QModelIndex index=this->index(x,y);

Вроде как она вызывается после добавления строки в table. Метод data(), например, возвращает строку ["name"] для данного индекса после "перещелкивания" вида. (Строка ["name"] и есть текст строки, отображаемый в QViewList). Вроде как, данная конструкция правильно высчитывает индекс. Но он по каким-то причинам получается невалидным. Непойму почему.
726  Qt / Model-View (MV) / QListView и его модель - не показываются новые записи после добавления в модель. : Июль 20, 2008, 00:37
Здравствуйте!


Столкнулся с такой проблемой. Имею приложение из одного окна, на котором расположены виджеты QTreeView и QListView. При клике на определенную ветку дерева в QTreeView, у меня появляется нужный список в QListView. Делается это так

Код:
// Действия при клике на ветку дерева
void mainwindow::on_nodetreeview_clicked(const QModelIndex &index)
{
 // Получаем нужную модель
 TreeItem *item = nodemodel->getItem(index);
 QAbstractListModel *tabmod = item->recordtable_getmodel();
 
 // Загрузка модели в представление
 recordview->setModel(tabmod);
}

И после этого, все пункты списка, которые есть в модели, видны на экране в виджете QListView.

Теперь мне нужно сделать функцию добавления пункта в список QListView. Я ее сделал в виде слота, который вызывается при клике на соответствущий пункт контекстного меню. Данный код расположен в том же файле главного окна что и предыдущий.

Код:
// Слот добавления новой записи в таблицу коннечых записей
void mainwindow::recordview_add_new(void)
{
 // Получение ссылки на модель таблицы конечных записей
 recordtablemodel *model=(recordtablemodel *)recordview->model();

 // Вставка данных в модель
 model->insert_new_record("New record in table","Text of new record");
 
 recordview->setModel(model);
 recordview->update();
 recordview->repaint();
}

Вставка данных проходит нормально, и модель начинает содержать новый пункт. Но вид этот пункт не отображает, видны только старые записи. Не помогает ни вставка этой же модели как "новой" через recordview->setModel(model);, ни update, ни repaint. А вот если кликнуть на какую-нибудь другую ветку, а затем вернуться в ту ветку, где было сделано добавление пункта, то этот новый пункт будет виден в списке.

Вопрос - как правильно обновить вид QListView, чтобы он начал показывать новые добавленные пункты?
 
727  Qt / Пользовательский интерфейс (GUI) / Re: Контекстное меню для виджета, созданного в QtDesigner : Июль 17, 2008, 21:56
Цитата: pastor
Асистант читать нехотим:
void QWidget::customContextMenuRequested ( const QPoint & pos )   [signal]

Хотим, но полноценно немогём. Я немецкий учил. И допетрить, что помимо события надо искать сдублированный сигнал мне как слабо знающему Qt реально сложно.

Цитата: spirit
Код:
connect(treeView, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showContextMenuForTreeView(const QPoint &)));

Ога, помогло. Только обязательно вначале надо сделать

Код:
recordview->setContextMenuPolicy(Qt::CustomContextMenu);

иначе сигнал до слота не дойдет.
728  Qt / Пользовательский интерфейс (GUI) / Контекстное меню для виджета, созданного в QtDesigner : Июль 17, 2008, 19:24
Здравствуйте!


Начал разбираться с контекстным меню, и что-то понять не могу как нада делать.

Есть форма, созданная в QtDesigner. На ней три виджета - QTreeView, QListView, QTextEdit. Нужно отлавливать вызов контекстного меню для разных виджетов, т.е. для каждого виджета должно быть свое контекстное меню.

Как оказалось, вызов контекстного меню - это не сигнал, а событие, которое можно переопределить для всего окна (как в примере mainwindows/menus),

Код:
...
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu(this);
    menu.addAction(cutAct);
    menu.addAction(copyAct);
    menu.addAction(pasteAct);
    menu.exec(event->globalPos());
}
...

Тогда будет одно контекстное меню для всего главного окна.

А нужно, чтоб для разных виджетов на главном окне было разное контекстное меню. Т.е., событие нужно переопределить для каждого конкретного виджета. И тут встал вопрос - как это сделать для виджета, который определен не кодом, а положен на форму в QtDesigner?
729  Qt / Интернационализация, локализация / Re: Чтение-запись файлов в кодировке UTF-8 при локале KOI-8R. : Июль 16, 2008, 21:10
Спасибо, заработало.
730  Qt / Интернационализация, локализация / Чтение-запись файлов в кодировке UTF-8 при локале KOI-8R. : Июль 16, 2008, 14:51
Здравствуйте!


Давайте разберемся с кодировками. Ситуация сейчас такая. Имею систему с локалью KOI-8R. Имею HTML файлы в кодировке UTF-8 (в них нигде charset не прописан, просто файлы с HTML разметкой в кодировке UTF-8).

Открываю файл через команды

Код:
QFile f(fullfilename); // Где fullfilename - полный путь к файлу
edittextarea->setHtml( QString::fromUtf8(f.readAll()) ); // Где edittextarea - объект класса QTextEdit

После редактирования сохраняю текст в файл командами

Код:
QTextStream out(&fullfilename);
QString content=edittextarea->toHtml();
out << content.toUtf8();

И получаю файл с битой кодировкой, в котором вместо русских букв пробелы (0x20), иногда какие-то коды типа 0x9C, 0x9D...

А если не давать команду конвертации при сохранении, например так

Код:
out << content;

То тогда сохраненный файл получается в системной кодировке KOI-8R, а нужно чтоб он был в той же UTF-8.


Вопрос - как в QT4 считывать и записывать файлы в нужной кодировке UTF-8, если кодировка локали отличается от UTF-8?
731  Qt / Пользовательский интерфейс (GUI) / Re: Как после записи измененного текста QTextEdit отметить, что он "не менялся"? : Июль 15, 2008, 17:01
см.
Цитировать
QTextDocument * QTextEdit::document () const

и  QTextDocument:
Цитировать
bool isModified () const
void setModified ( bool m = true )
void modificationChanged().

Спасибо, видимо то что нужно.

Вопрос - как вы эти методы в QtAssistant находите? Вот я смотрю страницу "List of All Members for QTextEdit" и там этих методов нет.. Понятно, их и не может быть в этом списке, но это же всю иерархию надо расковырять чтоб понять что из чего состоит.. Как вы это делаете?
732  Qt / Пользовательский интерфейс (GUI) / Как после записи измененного текста QTextEdit отметить, что он "не менялся"? : Июль 15, 2008, 16:16
Здравствуйте!


Что-то воткнуть не могу, как сделать следующее. Есть текстовый редактор на базе QTextEdit. И нужно сделать вот что. Если пользователь нажал кнопку "сохранить", текст сохранился в файл, и надо в каком-то свойстве установить, что текст не менялся.

Блин что-то путано получается. Скажу другими словами.

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

Вопрос 1. Есть ли метод, который информирует, был ли изменен текст QTextEdit? Что-то я не нашел, и на ум приходит только костыль через отловлю сигнала textChanged() и добавления своей логики по изменению дополнитеьного флага в этом обработчике.

Вопрос 2. Если такой метод есть, то можно ли принудительно в нужный момент (после сохранения текста в файл) изменить его флаг (?) так, чтобы данный метод показывал, что текст небыл изменен?
733  Qt / Пользовательский интерфейс (GUI) / Re: Не ловится сигнал currentRowChanged у selectionModel. Почему? : Июль 07, 2008, 17:10
Чиорт, вы правы, это были разные ошипки.

Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Object::connect: No such slot mainwindow::recordview_select(QModelIndex &index)
Object::connect:  (receiver name: 'MainWindow')
734  Qt / Пользовательский интерфейс (GUI) / Re: Не ловится сигнал currentRowChanged у selectionModel. Почему? : Июль 07, 2008, 16:53
В общем, стало работать. Всем, кто помогал - большое спасибо!
735  Qt / Пользовательский интерфейс (GUI) / Re: Не ловится сигнал currentRowChanged у selectionModel. Почему? : Июль 07, 2008, 16:51

Пример это хорошо, но вот блин непонятно для кого были написаны посты выше? Указывали посмотреть на консоль, указывали посмотреть что возвращает метод connect. Непонятно вобщем зачем тогда форум если не читать что пишут...
А ведь на консоли белым по мятому написано:

Цитировать
Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex)
Object::connect:  (receiver name: 'MainWindow')

Я ж грю, что изначально было два параметра при объявлении коннектора (коннектор был объявлен правильно). И такого сообщения в консоли небыло. Потом стал экспериментировать т.к. мне тут сказали что параметры сигнала и слота должны быть идентичными (хотя в доке написано что необязательно). А проблема была в том, что то, что стало слотом, ранее было просто методом, а я забыл перенести объявление в секцию слотов.
Страниц: 1 ... 47 48 [49] 50

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