LINUX.ORG.RU

[Qt][Class] Как сделать диалоговое окно?

 ,


0

0

Недавно начал изучение Qt, решил написать для более детального изучения что-либо свое, ибо изучать тупо по книжке не интересно, интереснее писать свое, ориентируясь в некоторых местах на книгу (так же когда-то начинал учить делфи, с, с++ =)). Выбор пал на «Сапера», ибо в линухе я сапера не видел. Собственно возник небольшой вопрос - как открыть из приложения дилоговое окно?

Вот у меня есть главный класс, окно которого является главным, в нем некоторые настройки и выбор сложности. При клике на кнопочку должно открыть второе окно, где уже сам сапер, настроенный в зависимости от выбранных параметров. Пока просто это заключается в клине на кнопочку «16 на 16» и открытии сапера 16 на 16 =)

Собственно все написал, все собирается, но при нажатии кнопки ничего не происходит, а в «консоль приложения» пишется

QLayout: Attempting to add QLayout «» to sixteen "", which already has a layout

при нажании на кнопку.

Код класса диалогового окна:

#ifndef SIXTEEN_H
#define SIXTEEN_H

#include <QtGui>

class sixteen : public QDialog
{
    Q_OBJECT
public:
    sixteen();
};

#endif // SIXTEEN_H

Код обработчика (создание массива кнопочек):

#include <QtGui>
#include "sixteen.h"

sixteen::sixteen() : QDialog()
{
    int i,j;

    setWindowTitle("Low level - 16x16");

    QWidget *wid = new QWidget(this);
    QVBoxLayout *mainLay = new QVBoxLayout(this);
    QGridLayout *btnLay = new QGridLayout(this);

    //Создаем массив кнопочег-полей
    QPushButton *massBtn[16][16];
    for (i=0;i<16;i++)
    {
        for (j=0;j<16;j++)
        {
            massBtn[i][j] = new QPushButton(" ",this);
            massBtn[i][j]->setFixedHeight(10);
            massBtn[i][j]->setFixedWidth(10);
            btnLay->addWidget(massBtn[i][j],i,j);
        }
    }

    //Размещаем все это на форме
    mainLay->addLayout(btnLay);
    wid->setLayout(mainLay);
}

Обработчик слота нажатия кнопки открытия этого диалога:

void mainWindow::btn1Clicked()
{
    sixteen windowSix;
    windowSix.show();
}

В чем может быть дело?

★★★★★

локальную-то переменную зачем создавать? вышел из слота - диалог умер.

а предупреждение из-за

QVBoxLayout *mainLay = new QVBoxLayout(this); QGridLayout *btnLay = new QGridLayout(this);

виджету можно установить только один лэйаут. передавая this в конструктор, ты его устанавливаешь.

ilyagoo
()
Ответ на: комментарий от ilyagoo

>локальную-то переменную зачем создавать? вышел из слота - диалог умер.

Эмм..поясни =)

виджету можно установить только один лэйаут. передавая this в конструктор, ты его устанавливаешь.


Спасибо, помогло.

Zhbert ★★★★★
() автор топика

надо так:

void mainWindow::btn1Clicked() 
{ 
    sixteen *windowSix = new sixteen(this, "windowSix"); 
    windowSix->show(); 
} 
и добавить соответствующий конструктор класса sixteen.

ну или так:

void mainWindow::btn1Clicked() 
{ 
    sixteen windowSix; 
    windowSix.exec(); 
} 
Torvus
()

Выбор пал на «Сапера», ибо в линухе я сапера не видел.

не знаю, как в гноме, но в кедах сапёр есть.

локальную-то переменную зачем создавать? вышел из слота - диалог умер.

Эмм..поясни =)

я поясню.

void mainWindow::btn1Clicked() 
{ 
    sixteen windowSix; 
    windowSix.show(); 
} 

здесь ты создаёшь локальную переменную, которая удаляется сразу после того, как выполнилось windowSix.Show() это выполняется быстро, поэтому твой диалог даже толком отрисоваться не успевает, как его уже удаляют. Поэтому ты его и не видишь. Тебе нужен указатель sixteen* windowSix = new sixteen(this)

name_no ★★
()
Ответ на: комментарий от name_no

здесь ты создаёшь локальную переменную, которая удаляется сразу после того, как выполнилось windowSix.Show() это выполняется быстро, поэтому твой диалог даже толком отрисоваться не успевает, как его уже удаляют. Поэтому ты его и не видишь. Тебе нужен указатель sixteen* windowSix = new sixteen(this)

Ага, спасибище!

Теперь ты его видел :}

Угу, но пофиг, все равно изобрету велосипед =)

Zhbert ★★★★★
() автор топика

>изучать тупо по книжке не интересно
конечно, куда интересней задалбывать всех своими RTFM вопросами))
таки советую почитать что-нибудь по языку и разные примеры программ Qt. ответы на 90% твоих дальнейших вопросов уже есть.

xydo ★★
()
Ответ на: комментарий от name_no

>не знаю, как в гноме, но в кедах сапёр есть.
В гноме тоже есть)
флажки, правда, не такие аккуратные)

xydo ★★
()
Ответ на: комментарий от xydo

>конечно, куда интересней задалбывать всех своими RTFM вопросами))
таки советую почитать что-нибудь по языку и разные примеры программ Qt. ответы на 90% твоих дальнейших вопросов уже есть.

Согласен, я попутно читаю книгу. А вопрос не такой уж и сложный, чтобы ответить. Посему слово «задалбывать» считаю неуместным в данном случае =)

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

Еще раз всем спасибо, все заработало =)

Zhbert ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

> А вопрос не такой уж и сложный, чтобы ответить. Посему слово «задалбывать» считаю неуместным в данном случае

Перемнож количество таких вопросов на количество спрашивающих и догадайся, что получится.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

>Перемнож количество таких вопросов на количество спрашивающих и догадайся, что получится.

Получится обычная ситуация для ЛОРа =)

Лично мне не проблема ответить, если я знаю эту тему, даже если вопрос банален и рассматривался много раз.

Zhbert ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.