Не понимаю, что сделал неправильно. В одном классе происходит инициализация элементов диалогового окна, а в другом, где они и используются, привязка сигналов к слотам. Но при этом почему-то нет реакции на слот. Сможете подсказать в чем дело?
Вот код:
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);
}
А ты уверен, что проходишь дальше:
if(!param_vec[k]) continue;
???if(!param_vec[k]) continue;
???Заголовочный файл QDialDistParam покажи полностью.
chkParamNameClick и btnColorClick в private slots: находятся?
в конфиги добавь CONFIG += console и откомпиль в дебаг-версии - если что-то не так с сигналами/слотами - то ругнется.
У меня тож проблемаю Сделал субкласс для QAbstractButton. Кнопка выводится реагирует на события, но когда пытаюсь связать со слотом то он не выполняется. Кто-нить может подсказать почему?
#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();
}
as001622, вижу в main'е:
QObject::connect(button2,SIGNAL(clicked()),&a, SLOT(quit()));
Это я ошибся когда скидывал, сокращал код, там должно стоять button1, но всё равно не работает
я слотом quit() не пользовался, но либо ты весь main показывай, либо если это весь, то закоментируй:
QWidget *window=new QWidget;
window->setStyleSheet("background: black");
т.к. у тебя этот виджет может не давать выйти из программы, если ты сделаешь его видимым show() от он будет в виде отдельного окна, а кнопка в виде другого.
пытался пользоваться слотом 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();
}
а с обычной кнопкой работает этот же код? мне просто сейчас уже в лом, что либо компилить
да обычная кнопка работает
ну если завтра будет время то попробую с компилить, а может на свежую голову и так увижу.
Со своей проблемой разобрался! Дело вот в чем. Все эти параметры привязываются к виджету при инициализации. ОБЯЗАТЕЛЬНО надо указывать виджет ДАННОГО класса. Т.е. в моем случае таким классом является
class QDialDistParam: public QDialog, public Ui::distParams
QWidget* wtab = main_window -> tab_widgets[k];
param_vec[index] -> chkParamName = new QCheckBox(wtab);
Слоты должны быть определены в
private slots: или public slots:
Я тоже нашёл ответ на свой вопрос. В каждой функции, обрабатывающей события необходимо было вставить строку QAbstractButton::functionname(event).
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)