【问题标题】:Qt4 existing slots are not recognizedQt4 现有插槽无法识别
【发布时间】:2009-04-28 10:23:46
【问题描述】:

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

Object::connect 没有这样的插槽 QTextEdit::append("移动状态") Object::connect 没有这样的插槽 QTextEdit::append("链接状态")

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

有什么想法吗?

一些代码示例:

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

【问题讨论】:

    标签: c++ qt qt4 signals-slots


    【解决方案1】:

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

    您将其称为方法签名:

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

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

    【讨论】:

    • 这不起作用。你的意思是把方法签名放在引号里吗?谢谢。
    • 哦该死,对不起,我在 Qt 和 PyQt 中工作并且使用了错误的语法。是的,绝对不是指引号哈哈...
    【解决方案2】:

    简而言之,克里斯有它。

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

    ...
    
    QPushButton *move = new QPushButton("Move");
    connect(move, SIGNAL(clicked()), textEdit, SLOT(MoveState()));
    }
    
    ...
    
    void MyTextEdit::MoveState()
    {
        append("move state");
    }
    

    【讨论】:

      【解决方案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)));
      

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

      【讨论】:

        【解决方案4】:

        假设您还有其他QPushButtons 会导致其他状态发生,您可以将它们放在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 ;
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          • 2020-02-25
          • 2017-11-27
          相关资源
          最近更新 更多