mdi

 
0
 
C++
ava
daemonaz | 22.03.2013, 15:42
Вопрос такой, нужно создать MDI-приложение, но с возможностью скрыть и восстановить имеющиеся окна без потери данных, не могу понять как это правильно сделать? В меню имеется пункт с наименованием окна и он помечается checked? если окно открыто, иначе not checked. Я реализовал через сигнал(triggered(bool))  и слот, который анализирует состояние checked или открывает, или закрывает конкретное окно.

Слот выглядет так


  if(!frmControl)
    {
       frmControl=new ControlForm;
       QMdiSubWindow *child = new QMdiSubWindow;
       child->setWidget(frmControl);
       child->setAttribute(Qt::WA_DeleteOnClose, false);
       ui->mdiArea->addSubWindow(child);
    }

    if (arg1){
        frmControl->show();

    }else{
        frmControl->hide();
    }


Как правильно реализовать такую концепцию?
Comments (6)
ava
bsa | 22.03.2013, 17:20 #
daemonaz, попробуй сначала менять парента (на null, например)
ava
daemonaz | 24.03.2013, 18:56 #
bsa, в смысле поменять парент?
Мне нужен совет как по заданному алгоритму написать лаконичный код, пользователь открывает меню и видит пункт Окно №1 (таких окон может быть несколько), если она не помечена, то создается субокно №1 (widget), с ним работает до сих пор пока не закроется, но при закрытии галочка должна быть снята. При нажатии пункта меню думаю использовать Signalmapper  и каждое окно имеет свой уникальный номер, я хотел в качестве сигнала от Signalmapper передавать QAction, но я так понял делать этого нельзя, гадаю каким образом связать создание окна с пометкой галочки пункта меню, а также при закрытии окна эту же галочку убрать. Опыта маловато. 
ava
math64 | 24.03.2013, 21:24 #
В ControlForm определи слот и напрямую соедини его с действием пункта меню.
Также в ControlForm нужны указатели на действие и QMDISubWindow*, которые понадобятся в обработчике слота.
Можно также иметь указатель на QDockWidget* - если хочешь разрешить прилеплять ControlForm к краю MainWindow в док-окне.
ava
daemonaz | 25.03.2013, 10:20 #
math64, то есть дать возможность управлять QAction той форме, которая была открыта под ее действием?
У меня получилось вот так


    frmControl = new ControlForm(ui->actionWindow_1);  
    ui->mdiArea->addSubWindow(frmControl);

    connect(ui->actionWindow_1, SIGNAL(triggered()), frmControl, SLOT(show()));


Класс дочерной формы



ControlForm::ControlForm(QAction *act, QWidget *parent) :
    QWidget(parent),
    m_act(act),
    ui(new Ui::ControlForm)
{    
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose, false);
}

ControlForm::~ControlForm()
{
    qDebug() << "I'm killed";
    delete ui;
}

void ControlForm::showEvent(QShowEvent *event)
{
    
    m_act->setChecked(true);
    
}

void ControlForm::closeEvent(QCloseEvent *event)
{
    
    m_act->setChecked(false);
    
}



Но при закрытии дочерного окна удаляется сам экземпляр, хотя я определил   
setAttribute(Qt::WA_DeleteOnClose, false)

Что неправильно?
ava
math64 | 25.03.2013, 13:09 #
Примерно так (не проверял):

ControlForm::ControlForm(QMdiArea *mdiArea, QAction *act) :
    QWidget(NULL),
    ui(new Ui::ControlForm),
    m_mdiArea(mdiArea)
    m_mdiSubWindow(new QMdiSubWindow)
    m_act(act),
{    
    ui->setupUi(this);
    m_mdiSubWindow->setWidget(this);
    m_mdiSubWindow->setAttribute(Qt::WA_DeleteOnClose, false);
    m_mdiSubWindow->setWindowTitle(act->text());
    m_mdiSubWindow->setWindowIcon(act->icon());
    m_mdiArea->addSubWindow(m_mdiSubWindow);
    connect(act, SIGNAL(triggered()), this, SLOT(onShow()));
}
void ControlForm::onShow()
{
    if (m_act->isChecked()) {
        m_mdiSubWindow->show();
    } else {
        m_mdiSubWindow->hide();
    }
}
ava
daemonaz | 25.03.2013, 14:19 #
math64, спасибо!  smile 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  bsa   daemonaz   math64
advanced
Submit