crossplatform.ru

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


  Ответ в Изменение содержимого диалога при его повторном вызове
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 10.3.2009, 15:13
  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();
}
kwisp Дата 10.3.2009, 14:31
 
Цитата(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, 13:11
 
Цитата(Adun177 @ 10.3.2009, 14:15) *
надо будет вызывать delete а не this->close();
если у диалога есть родитель, то он сам позаботится об удалении.

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

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

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


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

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


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

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

еще вопрос зачем сделано
virtual void show(void);
предполагается наследование данного класса?
Adun177 Дата 10.3.2009, 10:43
  Добрый день!
Программа работает с базой данных и отображает текущее состояние БД
Сделано стандартно по примеру 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);
            }

        }
    }
}
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 21:47