0

我有以下一段代码,出于某种原因,从UI窗口继承自QToolBar的MyActionDock,它显示没有任何问题,当单击按钮时,按钮颜色也发生了变化,但是插槽(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
}
4

2 回答 2

3

正如 Jay 建议的那样,直接连接到 QToolButton 并且不要 addAction,然后它就可以工作了。认为这是与 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()));
于 2013-01-28T16:05:56.920 回答
1

插槽位于错误的类中。

您在此处声明插槽 a1ActionSlot 位于 MyActionDock 类中:

connect (a1Action , SIGNAL (triggered()), this, SLOT(a1ActionSlot()));

第三个参数是“this”(指向 MyActionDock 类)。

您在 QtCanvasActionDock 类中实例化 a1ActionSlot 方法。

void QtCanvasActionDock::a1ActionSlot()
于 2013-01-25T21:52:14.983 回答