Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kolob от Ноябрь 13, 2010, 11:32



Название: Проблема с connect()
Отправлено: kolob от Ноябрь 13, 2010, 11:32
Добрый день всем! Помогите решить проблему. Суть такова:
Форму создал в дизайнере. Там же подключил все нужные сигнал-слоты. Один из connect() пришлось писать в файле *.ui.h
в одной из функции, которая вызывается из init() конструктора. При выполнении программы пишет в консоли следующее:
Цитировать
QObject::connect: No such slot MyDialog::func(int)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'MyDialog')
И соответственно функция-слот func() не выполняется.


Название: Re: Проблема с connect()
Отправлено: merke от Ноябрь 13, 2010, 11:34
Что значит пришлось? а по другому ни как? ???


Название: Re: Проблема с connect()
Отправлено: merke от Ноябрь 13, 2010, 11:35
Предоставь код


Название: Re: Проблема с connect()
Отправлено: GreatSnake от Ноябрь 13, 2010, 11:36
Цитировать
Один из connect() пришлось писать в файле *.ui.h
Подозреваю речь идёт про qt3?


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 13, 2010, 11:57
Да именно qt3.
Вот часть кода *.h файла:
Код:
class QPopupMenu;

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    MyDialog( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
    ~OrganizationHandbookDialog();

    QPopupMenu *p_my;
   
protected:
    QGridLayout* MyDialogLayout;
    QSpacerItem* spacer5;
    QGridLayout* frame4Layout;
    QSpacerItem* spacer4;
    QGridLayout* groupBox8Layout;

protected slots:
    virtual void languageChange();

private:
    void init();

private slots:
    void func(int);
};

Вот код *.ui.h файла:
Код:
void MyDialog::init()
{
create();
}

void MyDialog::create()
{
p_my = new QPopupMenu(this);

headerMenu->insertItem(tr(""), 0);
headerMenu->insertItem(tr(""), 1);
headerMenu->setCheckable(true);

QObject::connect(p_my, SIGNAL(activated(int)), this, SLOT(func(int)));
}


Название: Re: Проблема с connect()
Отправлено: GreatSnake от Ноябрь 13, 2010, 12:07
Цитировать
Да именно qt3.
Вообще-то не мешало бы про это указывать изначально.
А где сама func()?


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 13, 2010, 12:27
Код:
void MyDialog::func(int num)
{
QMessageBox::warning(this, tr(""), tr(""));
}


Название: Re: Проблема с connect()
Отправлено: GreatSnake от Ноябрь 13, 2010, 12:51
Хм, чего-то я не вижу проблем.


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 13, 2010, 14:07
Но почему пишет в консоль
Цитировать
QObject::connect: No such slot MyDialog::func(int)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'MyDialog')

И фукция не выполняется.
Смотрел сгенерированные файлы moc, там этот слот не прописан.


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 15, 2010, 07:41
Кто нибудь еще может помочь?


Название: Re: Проблема с connect()
Отправлено: GreatSnake от Ноябрь 15, 2010, 09:01
Выкладывай *.ui и *.ui.h - будем смотреть.


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 15, 2010, 09:46
Файл *.ui:
Код:
<connections>
    <connection>
        <sender>closeButton</sender>
        <signal>clicked()</signal>
        <receiver>MyDialog</receiver>
        <slot>close()</slot>
    </connection>
    <connection>
        <sender>addButton</sender>
        <signal>clicked()</signal>
        <receiver>MyDialog</receiver>
        <slot>add()</slot>
    </connection>
    <connection>
        <sender>deleteButton</sender>
        <signal>clicked()</signal>
        <receiver>MyDialog</receiver>
        <slot>remove()</slot>
    </connection>
    <connection>
        <sender>editButton</sender>
        <signal>clicked()</signal>
        <receiver>MyDialog</receiver>
        <slot>edit()</slot>
    </connection>
</connections>
<includes>
    <include location="local" impldecl="in implementation">mydialog.ui.h</include>
</includes>
<slots>
    <slot>setTable()</slot>
    <slot access="private" specifier="non virtual">add()</slot>
    <slot access="private" specifier="non virtual">remove()</slot>
    <slot access="private" specifier="non virtual">edit()</slot>
    <slot>updateTable()</slot>
</slots>
<functions>
    <function access="private" specifier="non virtual">init()</function>
</functions>

Файл *.ui.h:
Код:
#include <qobject.h>

void MyDialog::init()
{
create();
updateTable();
setTable();
}

void MyDialog::create()
{
        headerMenu = new QPopupMenu(this);
QObject::connect(headerMenu, SIGNAL(activated(int)), this, SLOT(show(int)));
}


void MyDialog::openHeaderMenu(QMouseEvent *event)
{
}

void MyDialog::show(int num)
{
}

void MyDialog::setTable()
{
}

void MyDialog::add()
{
}

void MyDialog::remove()
{
}

void MyDialog::edit()
{
}

void MyDialog::updateTable()
{
}


Название: Re: Проблема с connect()
Отправлено: GreatSnake от Ноябрь 15, 2010, 10:15
Ну и где в *.ui в <slots>
<slot>show(int)</slot>?

И чего-то я не понял - вы что  (см. выше "Вот часть кода *.h файла:" )
Код
C++ (Qt)
private slots:
   void func(int);
 
сами прописывали после того как его создал uic?


Название: Re: Проблема с connect()
Отправлено: kolob от Ноябрь 15, 2010, 12:54
Все сделал, работает. Всем спасибо. GreatSnake, да я сам после генерации дописал этот слот, в этом то и была моя ошибка!!!
Сейчас добавил его в дизайнере, сохранил, заново перекомпилил и все заработало и во всех файлах генерированных он прописался.