crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Сигнал/Слот проблемы
AD
  опции профиля:
сообщение 22.5.2008, 12:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Не понимаю, что сделал неправильно. В одном классе происходит инициализация элементов диалогового окна, а в другом, где они и используются, привязка сигналов к слотам. Но при этом почему-то нет реакции на слот. Сможете подсказать в чем дело?
Вот код:

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
  опции профиля:
сообщение 22.5.2008, 12:51
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А ты уверен, что проходишь дальше:
if(!param_vec[k]) continue;
???
Может ты и не привязываешь из-за этого вовсе. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.5.2008, 13:03
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


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

проверил, далее прохожу!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mixolap
  опции профиля:
сообщение 22.5.2008, 16:35
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 13.12.2007
Пользователь №: 46

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заголовочный файл QDialDistParam покажи полностью.
chkParamNameClick и btnColorClick в private slots: находятся?
в конфиги добавь CONFIG += console и откомпиль в дебаг-версии - если что-то не так с сигналами/слотами - то ругнется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
as001622
  опции профиля:
сообщение 22.5.2008, 18:30
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 20.5.2008
Пользователь №: 178

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня тож проблемаю Сделал субкласс для QAbstractButton. Кнопка выводится реагирует на события, но когда пытаюсь связать со слотом то он не выполняется. Кто-нить может подсказать почему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 22.5.2008, 19:05
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(as001622 @ 22.5.2008, 19:30) *
Кто-нить может подсказать почему?
Код покажи сначало. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
as001622
  опции профиля:
сообщение 22.5.2008, 19:27
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 20.5.2008
Пользователь №: 178

Спасибо сказали: 0 раз(а)




Репутация:   0  


#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
  опции профиля:
сообщение 22.5.2008, 19:43
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


as001622, вижу в main'е:
QObject::connect(button2,SIGNAL(clicked()),&a, SLOT(quit()));

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

---
P.S. Помни! параметры в функции QObject::connect() не проверяются компилятором полноценно! Ты должен сам за ними следить!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
as001622
  опции профиля:
сообщение 22.5.2008, 19:51
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 20.5.2008
Пользователь №: 178

Спасибо сказали: 0 раз(а)




Репутация:   0  


Это я ошибся когда скидывал, сокращал код, там должно стоять button1, но всё равно не работает

Сообщение отредактировал as001622 - 22.5.2008, 19:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.5.2008, 20:02
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я слотом quit() не пользовался, но либо ты весь main показывай, либо если это весь, то закоментируй:
QWidget *window=new QWidget;
window->setStyleSheet("background: black");
т.к. у тебя этот виджет может не давать выйти из программы, если ты сделаешь его видимым show() от он будет в виде отдельного окна, а кнопка в виде другого.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.7.2022, 14:33