Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt. Проблема с функцией connect, Не вызывается слот 
V
    Опции темы
maks991
Дата 10.12.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Здравствуйте. Решил воспользоваться функцией connect. Но...слот, который я там указал, не вызывается! Я прочитал подобные темы и на этом форуме, и на других, но все забывали просто какие-то простые вещи, после исправления которых всё работало. У меня все эти вещи на месте, но эффекта ноль.

Итак, во-первых, есть такой h-файл:
Код

class MainWindow : public QMainWindow
{
    Q_OBJECT

    ImageButton *button;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void f1();
};


И соответствующий cpp-файл:
Код

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
// ...
    connect(button, SIGNAL(pressed()), this, SLOT(f1()));
// ...
}

void MainWindow::f1()
{
    setWindowTitle("TTT!");
// ...
}


Вот. Никакой смены заголовка не происходит, как и других действий, которые есть у меня в f1(). Если что, то ImageButton - это мой класс, унаследованный от QPushButton.
Не понимаю, что не так я сделал...вроде всё так, но f1() не вызывается при нажатии... Помогите, пожалуйста разобраться. Заранее спасибо.
PM MAIL   Вверх
SABROG
Дата 10.12.2010, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Указатель на button валидный до connect'a?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Да, конечно. Делаю button = new ImageButton(...);
PM MAIL   Вверх
SABROG
Дата 10.12.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Добавлял в .pro файл

Код

CONFIG += console


и смотрел нет ли ошибок каких в консоли?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Оу, такого не знал. А я всё думал, где же консоль блин! smile Спасибо, приду через час и попробую глянуть, что там.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Добавил я эту строчку в .pro-файл и мне выдалась ошибка :: error: collect2: ld returned 1 exit status :(
PM MAIL   Вверх
SABROG
Дата 10.12.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Пересобери проект: mingw32-make clean && qmake && mingw32-make
и посмотри, чтобы в процессах не висела старая запущенная копия.

Это сообщение отредактировал(а) SABROG - 10.12.2010, 13:23


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Я в Qt Disigner работаю, так что просто кнопку Run жму. А в процессах прога не висит.
PM MAIL   Вверх
VAXVAX
Дата 10.12.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.11.2010

Репутация: нет
Всего: нет



кагдато и я наступал на теже грабли сейчас уже давно такой проблемы не сушествует smile 
PM MAIL   Вверх
maks991
Дата 10.12.2010, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Да фигня какая-то...всё ж верно, а не работает.
PM MAIL   Вверх
SABROG
Дата 10.12.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(maks991 @ 10.12.2010,  13:28)
Я в Qt Disigner работаю, так что просто кнопку Run жму. А в процессах прога не висит.

Ну пересобери проект и если не поможет, то сюда кинь ошибки, которые в консоль выдаются на этапе сборки.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Ок, смог вывести консоль. Но ошибок там никаких не выдаётся...ничего не пойму!! :(

Добавлено через 5 минут и 20 секунд
Короче такую фигню выявил. Если использовать QPushButton то всё работает! Но мой класс ImageButton наследован от QPushButton. Должно же тоже работать? Может нужно сигналы как-то переопределять в дочерних классах?
PM MAIL   Вверх
maks991
Дата 10.12.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Кстати, если добавляю в мой класс ImageButton макрос Q_IMAGE, то начинаются какие-то ошибки типа undefined reference to 'vtable for ImageButton'.
PM MAIL   Вверх
SABROG
Дата 10.12.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Не понятно откуда Вы вообще взяли макрос Q_IMAGE, в Qt его нет. В общем без полных исходных кодов сложно что-либо сказать.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
maks991
Дата 10.12.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 8.8.2010

Репутация: нет
Всего: нет



Ооой, Q_OBJECT я имел ввиду smile Итак:

imageButton.h :
Код

enum States {STATE_NORMAL, STATE_PRESSED};

class ImageButton : public QPushButton
{
    //Q_OBJECT

    QImage imageNormal;
    QImage imagePressed;
    States s;
    bool switcher;
public:
    ImageButton(QString imageNormalFileName, QString imagePressedFileName,
        bool switcher, bool active = false, QWidget *parent = 0);
    void paintEvent(QPaintEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);
    void mousePressEvent(QMouseEvent *e);
    void setActive(bool active);
};


imageButton.cpp :
Код

#include <imageButton.h>

ImageButton::ImageButton(QString imageNormalFileName, QString imagePressedFileName,
             bool switcher, bool active, QWidget *parent) : QPushButton(parent)
{
    // ...
}

void ImageButton::paintEvent(QPaintEvent *e)
{
    // ...
}

void ImageButton::mouseReleaseEvent(QMouseEvent *e)
{
    // ...
}

void ImageButton::mousePressEvent(QMouseEvent *e)
{
    // ...
}

void ImageButton::setActive(bool active)
{
    // ...
}


mainwindow.h :
Код

class MainWindow : public QMainWindow
{
    Q_OBJECT

    ImageButton *repeatAllButton;
    // ...
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void paintEvent(QPaintEvent *e);

private slots:
    void f1();
};


mainwindow.cpp :
Код

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    // ...
    repeatAllButton = new ImageButton("images/rep_all_normal.bmp", "images/rep_all_pressed.bmp", true, true);
    connect(repeatAllButton, SIGNAL(pressed()), this, SLOT(f1()));
    // ...
}

MainWindow::~MainWindow()
{
    // ...
}

void MainWindow::f1()
{
    setWindowTitle("TTT!");
    move(20,20);
    // ...
}

void MainWindow::paintEvent(QPaintEvent *e)
{
    // ...
}

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1167 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.