0

我目前正在尝试使用 Qt4 和 C++ 完成一个项目。我正在使用按钮在状态之间切换。在尝试将按钮的 clicked() 信号连接到 textEdit 以显示相关状态时,我遇到了一个错误:

Object::connect 没有这样的插槽 QTextEdit::append("move state") Object::connect 没有这样的插槽 QTextEdit::append("link state")

只是,QTextEdit 肯定有一个 append(QString) 插槽。

有任何想法吗?

一些代码示例:

QPushButton *move = new QPushButton("Move");
connect(move, SIGNAL(clicked()), textEdit, SLOT(append("move state")));
4

4 回答 4

6

在进行信号到插槽连接时,您不能将参数(字面意思)传递给 append() 插槽。

您将其称为方法签名:

SLOT(append(QString)) //or const QString, I'm not sure

如果每次单击该按钮时都需要文本框附加“移动状态”字样,那么您应该定义自己的插槽来进行附加。

于 2009-04-28T11:28:27.767 回答
4

简而言之,克里斯有它。

这是我更喜欢 boost::signals 的众多原因之一(您可以使用 boost::bind)。您基本上需要创建另一个函数来捕获信号然后执行附加。

...

QPushButton *move = new QPushButton("Move");
connect(move, SIGNAL(clicked()), textEdit, SLOT(MoveState()));
}

...

void MyTextEdit::MoveState()
{
    append("move state");
}
于 2009-04-28T12:02:49.073 回答
3

使用 aQSignalMapper将硬编码参数传递给文本编辑的插槽。

例子:

QSignalMapper* signalMapper = new QSignalMapper(this);
QPushButton* move = new QPushButton("Move");
signalMapper->setMapping(move, QString("move state"));
connect(move, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(signalMapper, SIGNAL(mapped(QString)), textEdit, SLOT(append(QString)));

请注意上述代码中的错误。

于 2009-05-07T00:06:07.130 回答
1

假设您将有其他QPushButtons 会导致其他状态发生,您可以将它们放在 aQButtonGroup中。然后,您可以使用枚举,例如{ MOVE_ID, STOP_ID, ... }引用可能的状态。

QPushButton* move = new QPushButton( "Move" ) ;
QPushButton* stop = new QPushButton( "Stop" ) ;
QButtonGroup* buttonGroup = new QButtonGroup() ;
buttonGroup->addButton( move, MOVE_ID ) ;
buttonGroup->addButton( stop, STOP_ID ) ;

// Connecting QButtonGroup to writing function
connect( buttonGroup, SIGNAL( buttonClicked( int ) ),
         textEdit, SLOT( append( int ) ) ) ;

textEdit中,您将定义一个函数,该函数根据您获得的状态附加适当的文本。

void append( int i )
{
   switch ( i )
   {
      case MOVE_ID:
         textEdit->append( "move state" ) ;
         break ;
      case STOP_ID:
         textEdit->append( "stop state" ) ;
         break ;
   }
}
于 2009-05-06T23:43:56.497 回答