2009-04-28 71 views
0

我目前正在尝试使用Qt4和C++来完成一个项目。我正在使用按钮在状态之间切换。虽然试图连接按钮的点击()信号到文本编辑显示相关的状态,我就死在了一个错误:只有Qt4现有的插槽不被识别

Object::connect No such slot QTextEdit::append("move state") Object::connect No such slot QTextEdit::append("link state")

,的QTextEdit肯定有追加(QString的)插槽。

任何想法?

某些代码样品:

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

回答

6

使信号以槽连接时,可以不通过在一个参数(字面)到append()槽。

你是指它像一个方法签名:

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

如果您需要的文本框追加的话“移动状态”这个按钮被点击每一次,那么你应该定义自己的槽,将尽追加。

+0

这不起作用。你的意思是把方法签名放在引号中吗?谢谢。 – pypmannetjies 2009-05-03 14:25:14

+0

哦,糟糕,对不起,我在Qt和PyQt中工作,并使用错误的语法。是的,绝对不意味着报价大声笑... – 2009-05-03 16:33:53

+0

感谢您的帮助 – pypmannetjies 2009-05-10 22:12:42

4

克里斯简而言之就是它。

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

... 

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

... 

void MyTextEdit::MoveState() 
{ 
    append("move state"); 
} 
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 ; 
    } 
} 
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))); 

当心在上面的代码中的错误。