我目前正在尝试使用Qt4和C ++完成一个项目。我正在使用按钮在状态之间切换。在尝试将按钮的clicked()信号连接到textEdit以显示相关状态时,我遇到了错误:
Object :: connect没有这样的插槽 QTextEdit :: append(“移动状态”) Object :: connect没有这样的插槽 QTextEdit :: append(“链接状态”)
只有,QTextEdit肯定有一个附加(QString)插槽。
有什么想法吗?
一些代码示例:
QPushButton *move = new QPushButton("Move");
connect(move, SIGNAL(clicked()), textEdit, SLOT(append("move state")));
答案 0 :(得分:6)
在向插槽连接发出信号时,不能将参数(字面上)传递给append()插槽。
您将其称为方法签名:
SLOT(append(QString)) //or const QString, I'm not sure
如果您需要文本框在每次单击该按钮时附加单词“move state”,那么您应该定义自己的插槽来执行追加。
答案 1 :(得分:4)
克里斯简而言之。
这是我喜欢boost :: signal的原因之一(你可以使用boost :: bind)。您基本上需要创建另一个捕获信号的函数,然后执行追加。
...
QPushButton *move = new QPushButton("Move");
connect(move, SIGNAL(clicked()), textEdit, SLOT(MoveState()));
}
...
void MyTextEdit::MoveState()
{
append("move state");
}
答案 2 :(得分:3)
使用QSignalMapper
将硬编码参数传递给文本编辑的插槽。
示例:
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)));
请注意上述代码中的错误。
答案 3 :(得分:1)
假设您将有其他QPushButton
s会导致其他状态发生,您可以将它们放在QButtonGroup
内。然后,您可以使用枚举(例如{ 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 ;
}
}