Просмотр сообщений
|
Страниц: 1 ... 47 48 [49] 50
|
722
|
Qt / Пользовательский интерфейс (GUI) / Передача данных из модального окна в основное через слот. Неполучается.
|
: Июль 23, 2008, 12:08
|
Здравствуйте! Есть простая задача - нужно из основного окна открыть небольшое модальное окно, ввести в нем пару строк, при нажатии OK передать данные в основное окно и закрыть это модальное окно. Я делаю так. Вот код основного окна. mainwindow.hclass 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.hclass 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.cppaddnewrecord::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
|
Асистант читать нехотим: void QWidget::customContextMenuRequested ( const QPoint & pos ) [signal] Хотим, но полноценно немогём. Я немецкий учил. И допетрить, что помимо события надо искать сдублированный сигнал мне как слабо знающему Qt реально сложно. 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?
|
|
|
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... А если не давать команду конвертации при сохранении, например так То тогда сохраненный файл получается в системной кодировке 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. Если такой метод есть, то можно ли принудительно в нужный момент (после сохранения текста в файл) изменить его флаг (?) так, чтобы данный метод показывал, что текст небыл изменен?
|
|
|
735
|
Qt / Пользовательский интерфейс (GUI) / Re: Не ловится сигнал currentRowChanged у selectionModel. Почему?
|
: Июль 07, 2008, 16:51
|
Пример это хорошо, но вот блин непонятно для кого были написаны посты выше? Указывали посмотреть на консоль, указывали посмотреть что возвращает метод connect. Непонятно вобщем зачем тогда форум если не читать что пишут... А ведь на консоли белым по мятому написано: Object::connect: No such signal QItemSelectionModel::currentRowChanged(QModelIndex) Object::connect: (receiver name: 'MainWindow') Я ж грю, что изначально было два параметра при объявлении коннектора (коннектор был объявлен правильно). И такого сообщения в консоли небыло. Потом стал экспериментировать т.к. мне тут сказали что параметры сигнала и слота должны быть идентичными (хотя в доке написано что необязательно). А проблема была в том, что то, что стало слотом, ранее было просто методом, а я забыл перенести объявление в секцию слотов.
|
|
|
|
|