crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> запуск виджета по нажатию кнопки
guest13
  опции профиля:
сообщение 13.11.2008, 14:48
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


Имеется 2 виджета. Необходимо реализовать такую ситуацию - при запуске программы появляется только 1 виджет, а второй запускается только после нажатия кнопки на 1-м виджете.
набросал вот такой код (просто запускается 2 виджета, на обоих имеются кнопки, которые закрывают программу (quit())).
Раскрывающийся текст
#include <QtGui>

//===========================

class MyWid2 : public QWidget
{
public:
    MyWid2(QWidget *parent = 0);
};

MyWid2::MyWid2(QWidget *parent)
    : QWidget(parent)
{
    setGeometry(600,400,300,200);
    
    QPushButton *q2 = new QPushButton(tr("exit"));
    q2->setFont(QFont("Times", 32, QFont::Bold));
    connect(q2, SIGNAL(clicked()), qApp, SLOT(quit()));
    
    QLabel *lab2=new QLabel;
    lab2->setText("lab2");
    lab2->setFont(QFont("Times", 24, QFont::Bold));
    
    QVBoxLayout *lay2 = new QVBoxLayout;
    lay2->addWidget(lab2);
    lay2->addWidget(q2);
    setLayout(lay2);
}

//=============================

class MyWid1 : public QWidget
{
public:
    MyWid1(QWidget *parent = 0);
};

MyWid1::MyWid1(QWidget *parent)
    : QWidget(parent)
{
    setGeometry(1000,200,300,200);

    QPushButton *q1 = new QPushButton(tr("Quit"));
    q1->setFont(QFont("Times", 18, QFont::Bold));

    connect(q1, SIGNAL(clicked()), qApp, SLOT(quit()));

    QLabel *lab1=new QLabel;
    lab1->setFont(QFont("Times",18,QFont::Bold));
    lab1->setText("lab1");

    QVBoxLayout *lay1 = new QVBoxLayout;
    lay1->addWidget(q1);
    lay1->addWidget(lab1);
    setLayout(lay1);
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWid1 w1;
    MyWid2 w2;

    w1.show();
    w2.show();

    return app.exec();
}

прошу помощи. :unsure: заранее благодарю за внимание
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.11.2008, 14:55
Сообщение #2


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

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

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




Репутация:   94  


Цитата(guest13 @ 13.11.2008, 17:48) *
w1.show();
w2.show();
ты их сам сразу оба показал

соответственно в main'е покажи только один.

Встречный вопрос: что ты предпринял, чтобы по нажатию кнопки отображался другой виджет? Раскажи логику своих действий.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
guest13
  опции профиля:
сообщение 13.11.2008, 14:55
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 13.11.2008, 14:52) *
Цитата(guest13 @ 13.11.2008, 17:48) *
w1.show();
w2.show();
ты их сам сразу оба показал

да.
но если 2-ю строчку закомментировать, то 2-й виджет и не будет показываться.
как я понимаю надо сделать что-то вроде следующего
connect(q1, SIGNAL(clicked()), w2, SLOT(show()));

только у меня не получается...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.11.2008, 14:57
Сообщение #4


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

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

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




Репутация:   94  


Цитата(guest13 @ 13.11.2008, 17:48) *
которые закрывают программу (quit())).
к стати сказать не верю, что она закрывается

Цитата(guest13 @ 13.11.2008, 17:55) *
только у меня не получается...
в это верю, т.к. не верю в предыдущее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
guest13
  опции профиля:
сообщение 13.11.2008, 15:00
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 13.11.2008, 14:57) *
Цитата(guest13 @ 13.11.2008, 17:48) *
которые закрывают программу (quit())).
к стати сказать не верю, что она закрывается

Эм-м... в чем причины сомнений?

connect(q1, SIGNAL(clicked()), qApp, SLOT(quit()));

обе кнопки закрывают приложение qApp.... :unsure:
(только что ещё разок проверил)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.11.2008, 15:12
Сообщение #6


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

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

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




Репутация:   94  


для начала, вынеси виджеты в отдельные пары файлов (h/cpp), будем считать, что в дальнейшем они могут сильно отличатся (хотя сейчас их лучше обеденить в один и сделать функции для установки нужных параметров).

Затем
Цитата(guest13 @ 13.11.2008, 17:55) *
connect(q1, SIGNAL(clicked()), w2, SLOT(show()));
насчет соеденить сигнал clicked со слотом show правильная, но видимо ты это решил проделать внутри виджета w1 (MyWid1), который ничего не знает о виджете w2 (MyWid2). при этом компилер (GCC, например) небудет ругатся, т.к. сигнально-слотовыми вещами занимается MOC (метаобъектный компилятор), а он будет ругатся в рантайме, но в консоль ошибок.

Дабы ты научился ловить такие ошибки, добавь в pro-файл такую строку:
CONFIG +=console
при запуске приложения у тебя появится консоль в которой будут сообщения об ошибках соединений сигналов и слотов.



Цитата(guest13 @ 13.11.2008, 18:00) *
обе кнопки закрывают приложение qApp....
(только что ещё разок проверил)
хм, ну видимо тебе повезло, что ты своих сигналов/слотов не создавал.

вобщем логика:
создал виджет 1
создал виджет 2
соеденил сигнал 1-го со слотом 2-го
показал 1-ый
запустил цикл событий приложения
(соображай где все эти действия нужно проделать!)

теперь электричество: нажал кнопку на 1-ом, пошел сигнал, т.к. соединен со слотом, сработал слот, отобразился второй виджет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
guest13
  опции профиля:
сообщение 13.11.2008, 15:32
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


таак-с...
Цитата(Litkevich Yuriy @ 13.11.2008, 15:12) *
для начала, вынеси виджеты в отдельные пары файлов (h/cpp), будем считать, что в дальнейшем они могут сильно отличатся (хотя сейчас их лучше обеденить в один и сделать функции для установки нужных параметров).

сначала буду с этим разбираться.... пока не очень ясна для меня картина создания виджетов в паре файлов... но тут в Учебном пособии, вроде разжеванна эта процедура

Цитата(Litkevich Yuriy @ 13.11.2008, 15:12) *
Цитата(guest13 @ 13.11.2008, 18:00) *
обе кнопки закрывают приложение qApp....
(только что ещё разок проверил)
хм, ну видимо тебе повезло, что ты своих сигналов/слотов не создавал.

хм-м...можно тогда пояснить, почему мне повезло и так не нужно делать?
эту конструкцию я взял из Учебного Пособия...

Цитата(Litkevich Yuriy @ 13.11.2008, 15:12) *
вобщем логика:
создал виджет 1
создал виджет 2
соеденил сигнал 1-го со слотом 2-го
показал 1-ый
запустил цикл событий приложения
(соображай где все эти действия нужно проделать!)

теперь электричество: нажал кнопку на 1-ом, пошел сигнал, т.к. соединен со слотом, сработал слот, отобразился второй виджет.

не очень уловил про "цикл событий приложения"
по поводу того, где это надо проделывать....
виджеты описать в отдельных файлах, затем в h-файлах связать сигналы. затем в main создать оба виджета и показать только 1-й....
так? :unsure:
Причина редактирования: не дави дважды кнопку &quot;отправить&quot;!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.11.2008, 15:51
Сообщение #8


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

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

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




Репутация:   94  


Цитата(guest13 @ 13.11.2008, 18:32) *
сначала буду с этим разбираться.... пока не очень ясна для меня картина создания виджетов в паре файлов... но тут в Учебном пособии, вроде разжеванна эта процедура
в заголовочный файл пишим объявление класса:
class MyWid2 : public QWidget
{
public:
    MyWid2(QWidget *parent = 0);
};

В *.cpp - реализацию
MyWid1::MyWid1(QWidget *parent)
    : QWidget(parent)
{
    setGeometry(1000,200,300,200);

    QPushButton *q1 = new QPushButton(tr("Quit"));
    q1->setFont(QFont("Times", 18, QFont::Bold));

    connect(q1, SIGNAL(clicked()), qApp, SLOT(quit()));

    QLabel *lab1=new QLabel;
    lab1->setFont(QFont("Times",18,QFont::Bold));
    lab1->setText("lab1");

    QVBoxLayout *lay1 = new QVBoxLayout;
    lay1->addWidget(q1);
    lay1->addWidget(lab1);
    setLayout(lay1);
}


Цитата(guest13 @ 13.11.2008, 18:32) *
хм-м...можно тогда пояснить, почему мне повезло и так не нужно делать?
эту конструкцию я взял из Учебного Пособия...
при использовании собственных слотов и сигналов, у тебя должен быть макрос Q_OBJECT в объявлении класса, приэтом запустится MOC, он создает еще по файлу на каждый файл с классом содержащим этот макрос, тогда при размещении и объявлении класса в одном файле приходится этот автоматически созданый файл к себе подключать это неудобно (ведь его нет до компиляции).

П.С. что за Учебное пособие?

Цитата(guest13 @ 13.11.2008, 18:32) *
не очень уловил про "цикл событий приложения"
Эта запись запускает цикл событий приложения:
Цитата(guest13 @ 13.11.2008, 17:48) *
app.exec();


Цитата(guest13 @ 13.11.2008, 18:32) *
по поводу того, где это надо проделывать....
Я умышленно написал все этапы и закончил их циклом событий приложения, чтобы показать что это все попорядку в одной функции (теперь максимально подсказал)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
guest13
  опции профиля:
сообщение 13.11.2008, 16:30
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 13.11.2008, 15:51) *
П.С. что за Учебное пособие?

вот это Учебное пособие
с h/cpp вроде немного разобрался, спасибо. Только я чуть раньше написал сам 8) , руководствуясь, опять-таки этим пособием


P.S. to Модератор
я не давлю дважды на кнопочку "отправить".... у меня на работе из-за прокси-сервера или ещё чего-нибудь запросы отправляются 3-ды.... я и почту постоянно по 3 письма отправляю... не судите строго, или разрешите мне править свои сообщения, я обычно сам удаляю лишние
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
guest13
  опции профиля:
сообщение 14.11.2008, 10:10
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 9.10.2008
Пользователь №: 386

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




Репутация:   0  


и снова здравствуйте)
хочу похвастаться, что всё-таки я сделал то что хотел! :clapping: спасибо огромное))
в итоге я сделал так
в wid1.h добавил вот такой сигнал
signals:
    void closed();

в wid2.h добавил вот такой слот
public slots:
    void myslot();

в wid2.cpp описал слот таким образом
void MyWid2::myslot()
{
    emit show();
}

в wid1.cpp свзязал сигнал кнопки с сигналом испускаемым виджетом wid1
QObject::connect(q1,SIGNAL(clicked()),this,SIGNAL(closed()));

ну и напоследок в main.cpp связал сигнал одного виджета со слотом другого
QObject::connect(&w1,SIGNAL(closed()),&w2,SLOT(myslot()));

и спросить - не слишком ли я намудрил со слотами и сигналами...может можно как-то упростить? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.4.2024, 11:17