Russian Qt Forum
Ноябрь 25, 2024, 04:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не вызывается слот при срабатывании сигнала  (Прочитано 2785 раз)
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);
}
« Последнее редактирование: Ноябрь 16, 2015, 20:30 от codenameRazuka » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Ноябрь 16, 2015, 23:14 »

Метод EnableAdmitButton вызывается?

как вариант, можно поиграться с другими сигналами, например *Clicked или с selectionModel()->selectionChanged
Записан

codenameRazuka
Гость
« Ответ #2 : Ноябрь 17, 2015, 00:00 »

Разобрался уже. Всего-то нужно было разделить описание класса и реализацию методов и пересобрать приложение, а я всё тупо в main писал. Я как-то даже не догадывался, что это принципиально. Плюс, вымораживающее "undefined reference to vtable for" наконец-то пропало.  Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Ноябрь 18, 2015, 07:32 »

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

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.166 секунд. Запросов: 23.