Russian Qt Forum

Qt => Вопросы новичков => Тема начата: codenameRazuka от Ноябрь 16, 2015, 20:26



Название: Не вызывается слот при срабатывании сигнала
Отправлено: codenameRazuka от Ноябрь 16, 2015, 20:26
Имеется класс диалогового окна. Необходимо, чтобы при активации элемента списка активировалась кнопка "Принять" (я создал необходимый слот). Но такого почему-то не происходит. В чём проблема?
Код:
class ChooseTableDialog: public QDialog
{
    Q_OBJECT

private:
    QListWidget *list;
    QPushButton *admitButton;
    QPushButton *cancelButton;

public:
    ChooseTableDialog(QWidget* parent);
    virtual ~ChooseTableDialog() {};

private slots:
    void EnableAdmitButton(QListWidgetItem*);

};

void ChooseTableDialog::EnableAdmitButton(QListWidgetItem* listWidgetItem)
{
    admitButton->setEnabled(true);
}

ChooseTableDialog::ChooseTableDialog(QWidget *parent = 0) : QDialog(parent)
{
    list = new QListWidget(this);
    admitButton = new QPushButton(QObject::tr("Принять"),this);
    cancelButton = new QPushButton(QObject::tr("Отмена"),this);

    admitButton->setEnabled(false);

    QObject::connect(admitButton, SIGNAL(clicked()), this, SLOT(close()));
    QObject::connect(cancelButton, SIGNAL(clicked()), this, SLOT(close()));
    QObject::connect(list, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(EnableAdmitButton(QListWidgetItem*)));


    QString *tablesString = new QString[6];
    tablesString[0]="user";
    tablesString[1]="group_";
    tablesString[2]="forum";
    tablesString[3]="section";
    tablesString[4]="topic";
    tablesString[5]="comment";

    QListWidgetItem **listWidgetItems = new QListWidgetItem*[6];

    for (int i = 0; i < 6; i++)
    {
        listWidgetItems[i]=new QListWidgetItem(tablesString[i],list);
    }

    for (int i = 0; i < 6; i++)
    {
        list->addItem(listWidgetItems[i]);
    }


    QVBoxLayout *mainLayout = new QVBoxLayout;

    QHBoxLayout *bottomLayout = new QHBoxLayout;
    bottomLayout->addWidget(admitButton);
    bottomLayout->addWidget(cancelButton);

    mainLayout->addWidget(list);
    mainLayout->addLayout(bottomLayout);

    this->setLayout(mainLayout);
}


Название: Re: Не вызывается слот при срабатывании сигнала
Отправлено: gil9red от Ноябрь 16, 2015, 23:14
Метод EnableAdmitButton вызывается?

как вариант, можно поиграться с другими сигналами, например *Clicked или с selectionModel()->selectionChanged (http://doc.qt.io/qt-4.8/qitemselectionmodel.html#selectionChanged)


Название: Re: Не вызывается слот при срабатывании сигнала
Отправлено: codenameRazuka от Ноябрь 17, 2015, 00:00
Разобрался уже. Всего-то нужно было разделить описание класса и реализацию методов и пересобрать приложение, а я всё тупо в main писал. Я как-то даже не догадывался, что это принципиально. Плюс, вымораживающее "undefined reference to vtable for" наконец-то пропало.  :)


Название: Re: Не вызывается слот при срабатывании сигнала
Отправлено: lit-uriy от Ноябрь 18, 2015, 07:32
Разобрался уже. Всего-то нужно было разделить описание класса и реализацию методов и пересобрать приложение, а я всё тупо в main писал. Я как-то даже не догадывался, что это принципиально. Плюс, вымораживающее "undefined reference to vtable for" наконец-то пропало.  :)
когда объявление и описание реализуешь в одном файле (например, file.cpp), тебе нужно после объявления в рукопашную подключать сгенерированный MOC-ом заголовочник
Код
C++ (Qt)
#include "file.moc"