Russian Qt Forum

Qt => Общие вопросы => Тема начата: olefard от Ноябрь 09, 2009, 09:32



Название: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 09, 2009, 09:32
создаю форму в дизайнере, на ней treeWidget, к классу подключается через множественное наследование, затем необходимо при вводе в lineEdit и нажатию на кнопку создавать новые item в treeWidget, и чтоб они там сохранялись....как получить доступ к созданной в дизайнере форме....подобные темы есть в форуме, но разобраться как сделать в моем случае так и не удалось...помогите, пожалуйста


Название: Re: Спасите!!! файлы Ui
Отправлено: lit-uriy от Ноябрь 09, 2009, 11:55
>> но разобраться как сделать в моем случае так и не удалось.
Опиши чем твой случай отличается от тех, что есть на форуме.


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 09, 2009, 12:05
treeWidget созданный в дизайнере изначально пустой...на форме есть lineedit и кнопка необходимо заполнить treeWidget item-ми, текст которых равен = тексту  lineedit, по нажатию кнопки. создаю слот
Код:
void Form3::on_pushButton_clicked()
{
    QString ret;
    ret = m_ui.lineEdit->text();



    QTreeWidgetItem* item =  new QTreeWidgetItem(0);
    m_ui.treeWidget->addTopLevelItem(item);
    item->setText(0,ret);

}

так вот...items добавляются в treeWidget, но не сохраняются там...если закрыть окно и снова открыть treeWidget пустой....как с этим бороться....или подскажите способ как создавать treeWidget и добавлять item, чтоб они там сохранялись???


Название: Re: Спасите!!! файлы Ui
Отправлено: lit-uriy от Ноябрь 09, 2009, 17:45
>>если закрыть окно и снова открыть treeWidget пустой
под окном понимается Form3?
полагаю тут UI-файлы не причём. Изобрази схематично, как у тебя взаимодействуют окна между собой, где, например, создаётся объект класса Form3?


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 09, 2009, 19:02
Form3 создается динамически в слоте
Код:
void MainWindow::on_pushButton_2_clicked()
{

 Form3* st = new   Form3;

    st->show();

}



Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 09, 2009, 19:03
Код:
class Form3 : public QWidget {
    Q_OBJECT
public:
    Form3(QWidget *parent = 0);
    Ui::Form3 m_ui;

protected:
    void changeEvent(QEvent *e);



private slots:
    void on_pushButton_clicked();
};


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 09, 2009, 19:05
и что??? как дальше быть??? как сделать правильно??? подскажите!!!Пожалуйста.. :-\


Название: Re: Спасите!!! файлы Ui
Отправлено: lit-uriy от Ноябрь 10, 2009, 02:15
Тут проблема в Си++:
в функции void MainWindow::on_pushButton_2_clicked() ты всякий раз создаёшь новый объект, соответсвенно он пустой.

Вынеси объявление указателя Form3* st в объевление класса MainWindow, в конструкторе MainWindow обнули его, а в этой функции сделай так:
Код
C++ (Qt)
if (!st){
  st = new Form3(); // Создаём объект если указатель st ещё ни куда не показывает
}
st->show();    // отображаем объект
 

П.С. т.к. объект не имеет родителя, то удалять его прийдётся тебе ручками.


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 05:46
все так сделал...вылетает программа при нажатии на кнопку...для вызова Form3


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 06:33
Как с этим бороться!!! :o, может у кого есть примеры как правильно использовать на форме treeWidget и добавлять в него item???может необязательно treeWidget...любой другой список...ПОМОГИТЕ НАДО СРОЧНО!!!а то уже тихо схожу с ума :'(


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 06:48
Вроде работает....при закрытии Form3, данные сохраняются....а как сделать чтоб они сохранялись и при перезапуске всей программы???


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 09:41
сохранять в файл или например QSettings


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 09:46
А по подробнее можно пожалуйста...и как это потом использовать???


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 09:57
кого из? про QSettings все в доке
Код:
http://doc.trolltech.com/4.5/qsettings.html
кстати вспомнил что есть такая штука как сохранение состояния окна, как-то так:
Код:
 void MyMainWindow::closeEvent(QCloseEvent *event)
 {
     QSettings settings("MyCompany", "MyApp");
     settings.setValue("geometry", saveGeometry());
     settings.setValue("windowState", saveState());
     QMainWindow::closeEvent(event);
 }
 void MainWindow::readSettings()
 {
     QSettings settings("MyCompany", "MyApp");
     restoreGeometry(settings.value("myWidget/geometry").toByteArray());
     restoreState(settings.value("myWidget/windowState").toByteArray());
 }
может помочь


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 10:04
а вы не могли бы объяснить, почему все так сложно...если дерево заполняется в Дизайнере, то все потом сохраняется, а если добавлять динамически, то нужны такие сложности, неужели никак нельзя добавить элемент, в уже существующее дерево и чтоб он там остался???


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 10:13
дерево в дизайнере заполняется в функции SetupUi. И просто повторяется вызов этой функции.
Ты можешь конечно написать свою функцию добавляющую, скажем 10 итемов, и звать ее при открытии программы. А смысл такой статики?

Это как "почему я создаю файл, он пустой и если я создам новый то он тоже будет пустой, а если я туда напишу чего-нибудь, этого не будет при создании еще одного"


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 10:19
А как тогда правильно сделать...сохранить дерево при помощи Settings????


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 10:43
ты сохранить стейт окна попробовал? я просто не работал с этой фичей и хз какие параметры он запоминает

Код:
где-то объявлено QSettings settings;

void saveItem(QTreeWidgetItem* item)
{
    settings.beginGroup(item->data(0, Qt::DisplayRole));
    settings.setValue("1", item->data(1, Qt::DisplayRole));
    settings.setValue("2", item->data(2, Qt::DisplayRole)); //и тд
    for(int i = 0; i < item->childCount(); i++) {
          QTreeWidgetItem* child = item->child(i);
          saveItem(child);
    }
    settings.endGroup();
}

voidSaveTree()
{
    settings.beginGroup("tree");
    saveItem(topItem)
    for(int i = 0; i < treeWidget->topLevelItemCount(); i++) {
          QTreeWidgetItem* item= treeWidget->takeTopLevelItem(i);
          saveItem(item);
    }
    settings.endGroup();
}
Чтение надо делать с помощью childGroups - вошли в группу "tree" и дальше рекурсивно


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 10:53
да у меня собственно в дереве не иерархическая структура...типа простого списка...попробую сделать


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 11:00
со списком проще, не нужно рекурсии. Это общий вариант. Мб можно и проще...


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 11:13
то есть мне сначально надо перегрузить событие закрытия окна и там делать сохранение дерева...???


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 11:17
можно в деструкторе главного окна


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 11:23
 а можно описать ход действий...просто возникают сразу вопросы: сохранять состояние всего окна или можно только treeWidget??? использовать чтение сохраненного состояния при создании экземпляра класса окна???


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 11:29
где сохранять - решать тебе. Вообще логично, что настройки окна (в частности триВиджета) должны читаться\сохраняться когда окно создается удаляется (т.е. в конструкторе\деструкторе). Единственный совет - сделать отдельными функциями, прозе будет переделать если вдруг захочется. Однако часто чтение настроек выносят в мейн, а запись бывает раскидана по коду (т.е. сохраняется напрямую в момент редактирования - по кнопке Apply допустим в неком диалоге).


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 11:39
А сохранять можно только тривиджет, точнее мне нужно, чтоб сохранилось название итемов и установленные данные для них, а все остальное можно не сохранять, ну там место положение и т.д., и остальные виджеты на окне??????????????


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 11:42
конечно


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 11:43
сейчас попробую...спасибо что помагаешь!!!


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 11:44
*помогаешь ;D


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 13:39
попытка оказалась не удачной :( Приложение вылетает, когда пытаюсь создать окно, в котором будут сохраняться настройки
запись насроек
Код:
void Form3::writeSettings()

{  QTreeWidgetItem* item;
    QSettings settings("Tr", "App");
    //for(int i = 0; i < treeWidget->topLevelItemCount(); i++) {
          //QTreeWidgetItem* item= treeWidget->takeTopLevelItem(i);
          settings.setValue("1", item->data(0, Qt::DisplayRole));
          settings.setValue("2", item->text(0));
   // }

}

чтение настроек
Код:
void Form3::readSettings()

{
    QSettings settings("Tr", "App");
    QString str = settings.value("2").toString();
    m_ui.treeWidget->topLevelItem(0)->setText(0, str);
}

Код:
void Form3::closeEvent(QCloseEvent *event)

{

        writeSettings();
         event->accept();

}
readSettings в конструкторе
В чем может быть дело?


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 13:50
  QTreeWidgetItem* item; // кто она? значение присвой


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 14:00
QTreeWidgetItem *item = m_ui.treeWidget->topLevelItem(0);
все равно вылетает


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 14:04
вызов чтения идет до setupUi()? в дизайнере в дереве есть элементы?


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 14:06
вызов чтения после setupUI элементов нет


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 14:09
если добавить элемент в дизайнере, то окно окрывается, но надписи нет...только след элемента, при добавлении нового, он добавляется...но если окно закр/открыть , то ничего несохраняется, где-то у меня косяк :(


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 14:13
выводи в консоль что читаешь из сеттингзов.
А во 2й раз вылетало, ибо дерево пустое и топЛевелитемов нет.
Надо
Код:
QTreeWidgetItem *item = new QTreeWidgetItem ();
item->setText(0, settings.value("2").toString());
m_ui.treeWidget->addTopLevelItem(item);


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 15:03
а как в readSettings узнать сколько итемов всего, было записано?


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 15:09
topLevelItemCount();


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 15:11
там не надо хранить это число, а достаточно использовать QStringList QSettings::childKeys ()
Но для этого нужна группа (или что бы не было лишних ключей)


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 15:13
 :'(чем дальше в лес, тем злее партизаны


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 15:17
ну смотри, ты записал 10 айтемов. Допустим ключ - номер строки
тогда при чтении зовешь QStringList keys = childKeys() и получаешь список всех ключей. Говоришь keys.count() - вуаля, 10


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 15:25
 :)вуаля!!! сейчас книжонку повнимательнее прочитаю...попробую сделать с ключами..спасибо


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 15:36
на... и почитай сначала все-таки книжек
Каждый раз кол-во итемов удваивается
а, да вот это:
Код:
    for(int i = 0; i< widget->topLevelItemCount(); i++) {
        QString val = widget->topLevelItem(i)->text(0);
        qDebug() << val;
        settings.setValue(QString::number(i), val);
    }
не нужно в функции load


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 15:46
да я вроде чиатю :-\


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 16:35
только теперь когда я пытаюсь удалять item, изменения почему-то не сохраняются


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 16:37
удаляю так
 delete m_ui.treeWidget->currentItem();


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 16:44
settings.clear() делай


Название: Re: Спасите!!! файлы Ui
Отправлено: olefard от Ноябрь 10, 2009, 17:00
а чтоб еще данные для итемов сохранять надо еще один QStringList добавить?


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 17:03
просто разные ключи делай (01 - 01строка 1й столбец, 02 - 2й столбец). Еще можно записать строки в QByteArray и хранить только его, и доставать из него же.


Название: Re: Спасите!!! файлы Ui
Отправлено: lit-uriy от Ноябрь 10, 2009, 18:20
Я б на месте местных админов клизмачей на вставлял, за превращении темы в кашу.

"Спасите!!! файлы Ui" причём здесь "как сохранять данные программы между её запусками"?


Название: Re: Спасите!!! файлы Ui
Отправлено: Igors от Ноябрь 10, 2009, 19:16
Я б на месте местных админов клизмачей на вставлял, за превращении темы в кашу.

"Спасите!!! файлы Ui" причём здесь "как сохранять данные программы между её запусками"?
Не понял. Я так думал все это посвящено тому что виджет/модель не сохраняет (в рамках одного запуска). Разве это не так?


Название: Re: Спасите!!! файлы Ui
Отправлено: Авварон от Ноябрь 10, 2009, 19:53
на самом деле уже нет) сейчас  автора интересет сохранение данным между запусками программы


Название: Re: Спасите!!! файлы Ui
Отправлено: Igors от Ноябрь 10, 2009, 20:01
на самом деле уже нет) сейчас  автора интересет сохранение данным между запусками программы
Спасибо, понял - широкий круг интересов