Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сигнал/Слот проблемы
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
AD
Не понимаю, что сделал неправильно. В одном классе происходит инициализация элементов диалогового окна, а в другом, где они и используются, привязка сигналов к слотам. Но при этом почему-то нет реакции на слот. Сможете подсказать в чем дело?
Вот код:

void QDialDistParam::setupDialog(QWidget* dialog)
{
    for(int k=1; k<reader -> tabs_count; ++k)
        distGraphics -> addTab(reader -> getMain() -> tab_widgets[k], QString());
    for(int k=0; k<param_vec.size(); ++k)
    {
        if(!param_vec[k]) continue;
        connect(param_vec[k] -> chkParamName, SIGNAL(clicked()), this, SLOT(chkParamNameClick()));
        connect(param_vec[k] -> btnColor, SIGNAL(clicked()), this, SLOT(btnColorClick()));
    }
}


void QDialDistParam::btnColorClick()
{
    QColor color = QColorDialog::getColor();
    if(!color.isValid()) return;            ///< если нажали Cancel

    QString color_name = color.name();
    QPushButton* btnClr = qobject_cast<QPushButton*> (sender());
    QString style_sheet = "* { background-color: ";
    style_sheet += color_name;
    style_sheet += " }";
    btnClr -> setStyleSheet(style_sheet);
}


/// Класс диалогового окна параметров по расстоянию
class QDialDistParam: public QDialog, public Ui::distParams
{
    Q_OBJECT

/// другие объявления

public:
    QVector<DIALPARAM*> param_vec;                ///< вектор параметров окна
    GraphicDisplay* graphic;                    ///< указатель на диалог с графиком
}


void TLV::dtDialogFill()
{
        dlgDist.setupDialog(this);
    dlgTime.setupDialog(this);
}
ViGOur
А ты уверен, что проходишь дальше:
if(!param_vec[k]) continue;
???
Может ты и не привязываешь из-за этого вовсе. :)
AD
Цитата(ViGOur @ 22.5.2008, 13:51) *
А ты уверен, что проходишь дальше:
if(!param_vec[k]) continue;
???
Может ты и не привязываешь из-за этого вовсе. :)

проверил, далее прохожу!
Mixolap
Заголовочный файл QDialDistParam покажи полностью.
chkParamNameClick и btnColorClick в private slots: находятся?
в конфиги добавь CONFIG += console и откомпиль в дебаг-версии - если что-то не так с сигналами/слотами - то ругнется.
as001622
У меня тож проблемаю Сделал субкласс для QAbstractButton. Кнопка выводится реагирует на события, но когда пытаюсь связать со слотом то он не выполняется. Кто-нить может подсказать почему?
ViGOur
Цитата(as001622 @ 22.5.2008, 19:30) *
Кто-нить может подсказать почему?
Код покажи сначало. :)
as001622
#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QtGui>

class MYButton : public QAbstractButton
{
   Q_OBJECT

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

    void setDefaulImageFileName(QString &filename);
    void setActionImageFileName(QString &filename);

protected:
   void paintEvent(QPaintEvent * pe);
   QSize sizeHint();

   void enterEvent(QEvent * e);
   void leaveEvent(QEvent * e);
   void mousePressEvent(QMouseEvent * e);
   void mouseReleaseEvent(QMouseEvent * e);

private:
    QString defaultImageFileName;
    QString actionImageFileName;
    QImage *defaultImage;
    QImage *actionImage;
    bool m_enter;
    bool m_leave;
    bool m_mousePressEvent;
    bool m_mouseReleaseEvent;
};

#endif


 #include <QtGui>
#include "MYbutton.h"    
static const int buttonWidth=233;
static const int buttonHeight=55;
static const QSize buttonSize(buttonWidth, buttonHeight);



MYButton::MYButton(QWidget *parent) : QAbstractButton(parent)
{
     QSize frameSize(buttonWidth+3, buttonHeight+6);
     setPalette(QPalette(QColor(0, 0, 0)));
     setAutoFillBackground(true);
     setMaximumSize(frameSize);
     setMinimumSize(frameSize);
     m_leave=true;
     m_enter=false;
     m_mousePressEvent=false;
     m_mouseReleaseEvent=false;
}

MYButton::~MYButton()
{
}

void MYButton::paintEvent(QPaintEvent *pe)
{    
     Q_UNUSED(pe);
     QImage *defaultImage = new QImage;
     QImage *actionImage = new QImage;
     defaultImage->load(defaultImageFileName);
     actionImage->load(actionImageFileName);
     QImage *image = new QImage;
     if (!m_enter)
     {
         image=defaultImage;
     }
     else
     {
         image=actionImage;
     };
    

     QPainter painter(this);
     QPointF point;
     if(!m_mousePressEvent)
     {
         point.setX(1);
         point.setY(1);
     }
     else
     {
         point.setX(3);
         point.setY(3);
     }
    
     painter.drawImage(point, *image);

}

QSize MYButton::sizeHint()
{
     return buttonSize;
}

void MYButton::enterEvent(QEvent *e)
{
     m_enter=true;
     this->repaint();
}

void MYButton::leaveEvent(QEvent *e)
{
     m_enter=false;
     m_mousePressEvent=false;
     this->repaint();
}

void MYButton::mousePressEvent(QMouseEvent *e)
{
     m_mousePressEvent=true;    
     this->repaint();
}

void MYButton::mouseReleaseEvent(QMouseEvent *e)
{
     m_mousePressEvent=false;
     this->repaint();
}

void MYButton::setActionImageFileName(QString &filename)
{
     actionImageFileName=filename;
}

void MYButton::setDefaulImageFileName(QString &filename)
{
     defaultImageFileName=filename;
}


#include <QtGui/QApplication>
#include <QtGui/QVBoxLayout>
#include "MYbutton.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
        QWidget *window=new QWidget;
    MYButton *button1=new MYButton;
    window->setStyleSheet("background: black");
    button1->setDefaulImageFileName(QString("images/default_button.png"));
    button1->setActionImageFileName(QString("images/action_button.png"));
    QObject::connect(button1,SIGNAL(clicked()),&a, SLOT(quit()));
    button1->show();
    return a.exec();
}
Litkevich Yuriy
as001622, вижу в main'е:
QObject::connect(button2,SIGNAL(clicked()),&a, SLOT(quit()));

но button2, в main'е нету!

---
P.S. Помни! параметры в функции QObject::connect() не проверяются компилятором полноценно! Ты должен сам за ними следить!
as001622
Это я ошибся когда скидывал, сокращал код, там должно стоять button1, но всё равно не работает
Litkevich Yuriy
я слотом quit() не пользовался, но либо ты весь main показывай, либо если это весь, то закоментируй:
QWidget *window=new QWidget;
window->setStyleSheet("background: black");
т.к. у тебя этот виджет может не давать выйти из программы, если ты сделаешь его видимым show() от он будет в виде отдельного окна, а кнопка в виде другого.
as001622
пытался пользоваться слотом close() тот же результат. Вообще для main чтобы проверить работает ли кнопка будет достаточно
#include <QtGui/QApplication>
#include <QtGui/QVBoxLayout>
#include "MYbutton.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MYButton *button1=new MYButton;
    button1->setDefaulImageFileName(QString("images/default_button.png"));
    button1->setActionImageFileName(QString("images/action_button.png"));
    QObject::connect(button1,SIGNAL(clicked()),&a, SLOT(quit()));
    button1->show();
    return a.exec();
}


но всё равно не работает
Litkevich Yuriy
а с обычной кнопкой работает этот же код? мне просто сейчас уже в лом, что либо компилить ;)
as001622
да обычная кнопка работает
Litkevich Yuriy
ну если завтра будет время то попробую с компилить, а может на свежую голову и так увижу.
AD
Со своей проблемой разобрался! Дело вот в чем. Все эти параметры привязываются к виджету при инициализации. ОБЯЗАТЕЛЬНО надо указывать виджет ДАННОГО класса. Т.е. в моем случае таким классом является
class QDialDistParam: public QDialog, public Ui::distParams

Значит, QWidget** tab_widgets должна быть переменной именно этого класса, а не класса TLV.
Ошибочным являлся следующий отрывок кода:
QWidget* wtab = main_window -> tab_widgets[k];
param_vec[index] -> chkParamName = new QCheckBox(wtab);
Mixolap
Слоты должны быть определены в
private slots: или public slots:
as001622
Я тоже нашёл ответ на свой вопрос. В каждой функции, обрабатывающей события необходимо было вставить строку QAbstractButton::functionname(event).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.