Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ QT интерфейс, ООП

Автор: =DENIS= 10.2.2012, 19:21

Такой вопрос. В документации QT все примеры построены таким образом, создается класс, унаследованный от QWidget (QMainWIndow, ...) и в нем уже производятся действия: построение интерфейса, чтение файла, работа с сетью и т.п. Но мне кажется, что не правильно совмещать класс интерфейса и свои алгоритмы работы программы: работа с файлами, работа с сетью и т.п. Мне кажется, что надо создавать какой-то класс (допустим class Manager) который управляет и интерфейсом(GUI) и основной работой программы. Я прав или нет? Подскажите.

Автор: BRE 10.2.2012, 19:30

Прав. В идиале GUI должен легко убираться/заменяться на другой без ущерба для функциональности программы.

Автор: Гость_=DENIS=_* 10.2.2012, 19:48

Цитата(BRE @ 10.2.2012, 19:30) *
Прав. В идиале GUI должен легко убираться/заменяться на другой без ущерба для функциональности программы.


Так почему же в офф документации так пишут, для наглядности?

И такой вопрос, как в QtDesignet назначить для основной формы основной мнеджер компановки, назначаемый функцией setLayout(QLayout *l); Что-то не нашел такого.

Автор: Гость_=DENIS=_* 10.2.2012, 19:51

И как мне тогда лучше поступать, делать в С++ что-то подобное на интерфейсы в Java или передавать указатели на функции в интерфейс, чтобы эти функции выполнялись по нажатию кнопки?

Автор: BRE 10.2.2012, 20:03

Цитата(Гость_=DENIS=_* @ 10.2.2012, 20:48) *
Так почему же в офф документации так пишут, для наглядности?

Это примеры, показывающие функционал Qt, а не то как правильно писать программы с использованием Qt.

Цитата(Гость_=DENIS=_* @ 10.2.2012, 20:48) *
И такой вопрос, как в QtDesignet назначить для основной формы основной мнеджер компановки, назначаемый функцией setLayout(QLayout *l); Что-то не нашел такого.

Выбираешь саму форму и выбираешь тип компановки в меню "Форма".

Цитата(Гость_=DENIS=_* @ 10.2.2012, 20:51) *
И как мне тогда лучше поступать, делать в С++ что-то подобное на интерфейсы в Java или передавать указатели на функции в интерфейс, чтобы эти функции выполнялись по нажатию кнопки?

В тех классах, объекты которых будут взаимодействовать с GUI, определять слоты и соединять сигналы от кнопок со слотами этих объектов-обработчиков.

Автор: Гость_=DENIS=_* 12.2.2012, 10:05

Спасибо за помощь.

Автор: Гость_=DENIS=_* 22.2.2012, 22:51

Есть класс WaitDialog унаследованный от QDialog

#include "waitdialog.h"
#include <QtCore/QString>
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
#include <QtGui/QHBoxLayout>

WaitDialog::WaitDialog(QObject *parrent):QDialog(parrent)
{
    label = new QLabel(tr("Wait please"));
    cancelButton = new QPushButton(tr("Cancel"));
    QHBoxLayout *layout = new QHBoxLayout();
    layout->addWidget(label);
    layout->addWidget(cancelButton);
    setLayout(layout);
}

void WaitDialog::setText(QString mes)
{
    label->setText(mes);
}

QString WaitDialog::getText()
{
    return label->text();
}


Как правильно свзяать сигнал кнопки с внешним слотом (находится в основном классе Manger). Сделать механизм, подобный интерфейса, или сдалеать в WaitDialog функцию, в которую буду передавать SLOT(mySlot())???

Автор: RazrFalcon 23.2.2012, 9:37

Можно в WaitDialog передавать указатель на класс Manger.

WaitDialog::WaitDialog(Manger *manger, QObject *parrent):QDialog(parrent)
{
    cancelButton = new QPushButton(tr("Cancel"));
    connect(cancelButton,SIGNAL(clicked()),manger,SLOT(mySlot());
}

Или при создании самого WaitDialog в классе Manger конектить его с вашим слотом в WaitDialog:
//в Manger создаем waitDialog, а затем:
    connect(waitDialog,SIGNAL(cancelButton_clcked(),this,SLOT(mySlot());

void WaitDialog::cancelButton_clcked() {
}
    //...
{

Автор: Гость_=DENIS=_* 23.2.2012, 14:46

Цитата(RazrFalcon @ 23.2.2012, 9:37) *
Можно в WaitDialog передавать указатель на класс Manger.
WaitDialog::WaitDialog(Manger *manger, QObject *parrent):QDialog(parrent)
{
    cancelButton = new QPushButton(tr("Cancel"));
    connect(cancelButton,SIGNAL(clicked()),manger,SLOT(mySlot());
}

Или при создании самого WaitDialog в классе Manger конектить его с вашим слотом в WaitDialog:
//в Manger создаем waitDialog, а затем:
    connect(waitDialog,SIGNAL(cancelButton_clcked(),this,SLOT(mySlot());

void WaitDialog::cancelButton_clcked() {
}
    //...
{


Автор: Гость_=DENIS=_* 23.2.2012, 14:48

Цитата(RazrFalcon @ 23.2.2012, 9:37) *
Можно в WaitDialog передавать указатель на класс Manger.
WaitDialog::WaitDialog(Manger *manger, QObject *parrent):QDialog(parrent)
{
    cancelButton = new QPushButton(tr("Cancel"));
    connect(cancelButton,SIGNAL(clicked()),manger,SLOT(mySlot());
}

Или при создании самого WaitDialog в классе Manger конектить его с вашим слотом в WaitDialog:
//в Manger создаем waitDialog, а затем:
    connect(waitDialog,SIGNAL(cancelButton_clcked(),this,SLOT(mySlot());

void WaitDialog::cancelButton_clcked() {
}
    //...
{


Да, так можно. А может попробывать сделать что-то подобное интерфейсу?

Автор: Sokoloff 24.2.2012, 11:13

Цитата(Гость_=DENIS=_* @ 22.2.2012, 23:51) *
Как правильно свзяать сигнал кнопки с внешним слотом (находится в основном классе Manger). Сделать механизм, подобный интерфейса, или сдалеать в WaitDialog функцию, в которую буду передавать SLOT(mySlot())???

Я бы сделал что-то вроде

Если не надо обрабатывать клик в WaitDialog.
//waitdialog.h
class WaitDialog: public QDialog
{
...

signals:
   void closeBtnClicked();
}

//waitdialog.cpp

WaitDialog::WaitDialog(QObject *parrent):QDialog(parrent)
{
    ...
    cancelButton = new QPushButton(tr("Cancel"));
    connect(cancelButton, SIGNAL(clicked()), this, SIGNAL(closeBtnClicked()));
}



Если WaitDialog должен что-то делать перед или после клика.
//waitdialog.h
class WaitDialog: public QDialog
{
...

private slots:
   void closeBtnClickedSlot();

signals:
   void closeBtnClicked();
}

//waitdialog.cpp

WaitDialog::WaitDialog(QObject *parrent):QDialog(parrent)
{
    ...
    cancelButton = new QPushButton(tr("Cancel"));
    connect(cancelButton, SIGNAL(clicked()), this, SLOT(closeBtnClickedSlot()));
}

void WaitDialog::closeBtnClickedSlot()
{
   ...
   emit closeBtnClicked();
   ...
}



Автор: BRE 24.2.2012, 21:24

Не знаю для чего соединять кнопку Cancel со слотом, но может поможет...
Посмотри на QProgressDialog, в документации есть пример как его показывать и как обрабатывать нажатие Cancel.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)