crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Изменение содержимого диалога при его повторном вызове
Adun177
  опции профиля:
сообщение 10.3.2009, 10:43
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 25.2.2009
Пользователь №: 575

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!
Программа работает с базой данных и отображает текущее состояние БД
Сделано стандартно по примеру QT - считывание с БД происходит в конструкторе
теперь я пытаюсь переопределить метод show но ничего не выводится
вот код. Нужно сделать так чтобы каждый раз при вызове диалога программа считывала с БД и создавала список.

Код
class EditExForm : public QWidget
{
    Q_OBJECT

public:
    EditExForm(QWidget *parent = 0);
    void set_dialog_create(QWidget *dialog_in){dialog_create=dialog_in;}
    void set_dialog_edit(EditForm *dialog_in){dialog_edit=dialog_in;}
    void set_dialog_db(QWidget *dialog_in){dialog_db=dialog_in;}

    protected:    
    virtual void show(void);

private slots:
    void on_IDCREATE();
    void on_IDREMOVE();
    void on_IDEDIT();
    void on_IDCANCEL();
    void on_IDC_LIST1();

private:
  
   QPushButton *ui_IDCREATE;
   QPushButton *ui_IDREMOVE;
   QPushButton *ui_IDEDIT;
   QPushButton *ui_IDCANCEL;
   QListWidget *ui_IDC_LIST1;
   QTextEdit *ui_IDC_EDIT1;
   QWidget *dialog_db;
   EditForm *dialog_edit;
   QWidget *dialog_create;
   QLabel *ui_label1;
   QGroupBox *ui_label2;
};

EditExForm::EditExForm(QWidget *parent)
:QWidget(parent)
{
QUiLoader loader;

    QFile file("widgeteditex.ui");
    file.open(QFile::ReadOnly);
    QWidget *formWidget = loader.load(&file, this);
    file.close();
    ui_IDREMOVE = qFindChild<QPushButton*>(this, "IDREMOVE");
    ui_IDCANCEL = qFindChild<QPushButton*>(this, "IDCANCEL");
    ui_IDC_LIST1=qFindChild<QListWidget*>(this,"IDC_LIST1");
    ui_IDC_EDIT1=qFindChild<QTextEdit*>(this,"IDC_EDIT1");
    ui_IDCREATE = qFindChild<QPushButton*>(this, "IDCREATE");
    ui_IDEDIT = qFindChild<QPushButton*>(this, "IDEDIT");
    ui_label1=qFindChild<QLabel*>(this, "IDC_STATIC1");
    ui_label2=qFindChild<QGroupBox*>(this, "IDC_STATIC2");
    
    ui_label1->setText(message[56]);
    ui_label2->setTitle(message[57]);
    ui_IDREMOVE->setText(message[59]);
    ui_IDCANCEL->setText(message[61]);
    ui_IDCREATE->setText(message[58]);
    ui_IDEDIT->setText(message[60]);


    connect(ui_IDREMOVE, SIGNAL(clicked()), this, SLOT(on_IDREMOVE()));
    connect(ui_IDCANCEL, SIGNAL(clicked()), this, SLOT(on_IDCANCEL()));
    connect(ui_IDEDIT, SIGNAL(clicked()), this, SLOT(on_IDEDIT()));
    connect(ui_IDCREATE, SIGNAL(clicked()), this, SLOT(on_IDCREATE()));
    connect(ui_IDC_LIST1, SIGNAL(itemSelectionChanged()), this, SLOT(on_IDC_LIST1()));
    
}
void EditExForm::show(void)
{
    QSqlQuery query6;
    query6.exec("SELECT ex_name,ex_name_desc,ex_id FROM exercizes ORDER BY ex_id");
    static bool flag=false;
    if ( query6.isActive() )
    {
        while ( query6.next() )
        {
            QString name = query6.value(0).toString();
            QString name2 = query6.value(1).toString();
            QListWidgetItem *newItem = new QListWidgetItem;
            newItem->setText(name);
            ui_IDC_LIST1->addItem(newItem);
            if (!flag)
            {    
                flag=true;
                ui_IDC_EDIT1->setText(name2);
            }

        }
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.3.2009, 10:51
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


и вам день добрый.
Цитата(Adun177 @ 10.3.2009, 10:43) *
я пытаюсь переопределить метод show но ничего не выводится

это не просто метод а слот и при том не protected:
попробуй переопределить в секции
public slots:
хотя не уверен что сработает.


почему бы не сделать так что бы это:
Цитата(Adun177 @ 10.3.2009, 10:43) *
при вызове диалога программа считывала с БД и создавала список.

происходило по событию показа диалога.
QWidget::showEvent(QShowEvent* ev)
для этого достаточно переопределить этот метод и все.
не знаю правда как будет реагировать если уже показанный диалог скрыть и потом опять показать... скорее всего
обработчик вызовется еще один раз.

еще вопрос зачем сделано
virtual void show(void);
предполагается наследование данного класса?

Сообщение отредактировал kwisp - 10.3.2009, 10:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 10.3.2009, 10:58
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Show() для этого не самое лучшее место. Слишком часто она вызывается, например, если свернуть и восстановить окно. Лучше сделай отдельную процедуру для формирования списка и вызывай ее из конструктора и всякий раз, когда тебе надо этот список обновить. Для этого ее можно сделать слотом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Adun177
  опции профиля:
сообщение 10.3.2009, 11:15
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 25.2.2009
Пользователь №: 575

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Kagami @ 10.3.2009, 10:58) *
Show() для этого не самое лучшее место. Слишком часто она вызывается, например, если свернуть и восстановить окно. Лучше сделай отдельную процедуру для формирования списка и вызывай ее из конструктора и всякий раз, когда тебе надо этот список обновить. Для этого ее можно сделать слотом.

Если я правильно понял при закрытии диалога надо будет вызывать delete а не this->close();
Сорри за ламерские вопросы по QT - просто я с помощью него пишу диалоговые окна для приложения на GL а это чистый С поэтому путаюсь в объектно-ориентированном программировании. Если несложно подкиньте рабочий код для моей задачи.


Всем спасибо заработало через ShowEvent
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.3.2009, 13:11
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Adun177 @ 10.3.2009, 14:15) *
надо будет вызывать delete а не this->close();
если у диалога есть родитель, то он сам позаботится об удалении.

А вообще покажи как ты его вызываешь.

И еще почему для диалога используется наследование от QWidget, а не от QDialog?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.3.2009, 14:31
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Adun177 @ 10.3.2009, 11:15) *
Всем спасибо заработало через ShowEvent

смотри сам.
будет вызваться не только при твоем вызове show() но и при свертывании и разворачивании окна к примеру мышкой или переключениии по Alt+Tab, если не ошибаюсь.

лучше покажи как работаешь с диалогом он в классе или сам по себе, есть ли у него владелец???
может состряпаем метод заполнения и все.
типа:
Раскрывающийся текст
void MyDialog::FillMeAndShowMe(){
QSqlQuery query6;
    query6.exec("SELECT ex_name,ex_name_desc,ex_id FROM exercizes ORDER BY ex_id");
    static bool flag=false;
    if ( query6.isActive() )
    {
        while ( query6.next() )
        {
             QString name = query6.value(0).toString();
            QString name2 = query6.value(1).toString();
            QListWidgetItem *newItem = new QListWidgetItem;
            newItem->setText(name);
            ui_IDC_LIST1->addItem(newItem);
            if (!flag)
            {    
                flag=true;
                ui_IDC_EDIT1->setText(name2);
            }

        }
    }
show();
}

как надо показать и заполнить вызываешь его.
как просто показать вызываешь просто show()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.3.2009, 15:13
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Adun177, я бы сделал примерно так (общий случай):
EditExForm::EditExForm(QWidget* p_parent) : QDialog(p_parent)
{
    model = new QSqlQueryModel; // QSqlQueryModel    *model;
    view->setModel(model);        // QListView        *view; (существует в ui-файле)
    update();

}

void EditExForm::update()
{
  QSqlQuery        q(db);
  QString        qstr, qerr;

    qstr = QString("SELECT ex_name,ex_name_desc,ex_id FROM exercizes ORDER BY ex_id")
    model->setQuery(qstr, db);
    qerr = model->lastError().text();
    qDebug() << "EditExForm, Error: " << qerr;


}

Применение
void MainWindow::SlotEditExForm()
{
    EditExForm    dlg(this);
    dlg.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 12:43