У меня есть следующий кусок кода, по какой-то причине, из окна пользовательского интерфейса, MyActionDock, унаследованного от QToolBar, он отображается без каких-либо проблем, при нажатии на кнопку цвет кнопки также меняется, но слоты (a1ActionSlot () и a2ActionSlot ()), подключенные к сигналам, никогда не вызываются, чувствую, что действие никогда не запускается. Я использую Qt 4.7.2. Что с этим не так? Большое спасибо.
Я считаю, что код, используемый для правильной работы для Qt4.6 или ранее. Не знаю, когда возникнет проблема.
MyActionDock::MyActionDock (QWidget *parent) :
QToolBar (parent)
{
setOrientation (Qt::Vertical);
setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
setFixedWidth(canvas()->toolsDockWidth());
// ACTIONS
QToolButton * a1btn= new QToolButton (this);
a1btn->setText("Action 1");
a1btn->setIcon(QIcon("a1.png"));
a1btn->setToolTip ("Some action a1");
a1btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
QAction *a1Action = addWidget(a1btn);
connect (a1Action , SIGNAL (triggered()), this, SLOT(a1ActionSlot()));
addAction (a1Action);
QToolButton * a2Btn = new QToolButton (this);
a2Btn ->setText("A2");
a2Btn ->setIcon(QIcon("a2.png"));
a2Btn ->setToolTip ("something");
QAction *a2Action= addWidget(a2Btn );
connect (a2Action, SIGNAL (triggered()), this, SLOT(a2ActionSlot()));
addAction (a2Action);
}
void MyActionDock::a1ActionSlot()
{
//do something
}
void MyActionDock::a2ActionSlot()
{
//do something
}
Как предположил Джей, подключитесь напрямую к QToolButton и не добавляйте действие, тогда оно работает. Думаю, что это проблема, связанная с обновлением Qt. Код, используемый для работы в Qt 4.6 или более ранней версии, но перестал работать после 4.7. Так что для 4.7, если вы хотите использовать QToolButton, напрямую подключите сигнал кнопки.
QToolButton * a2Btn = new QToolButton (this);
a2Btn ->setText("A2");
a2Btn ->setIcon(QIcon("a2.png"));
a2Btn ->setToolTip ("something");
addWidget(a2Btn );
connect (a2Btn , SIGNAL (clicked()), this, SLOT(a2ActionSlot()));
Слот находится в неправильном классе.
Вы заявляете, что слот a1ActionSlot находится в классе MyActionDock здесь:
connect (a1Action , SIGNAL (triggered()), this, SLOT(a1ActionSlot()));
Третий параметр — это this (который указывает на класс MyActionDock).
Вы создаете экземпляр метода a1ActionSlot в классе QtCanvasActionDock.
void QtCanvasActionDock::a1ActionSlot()