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 をもっと気に入っている多くの理由の 1 つです (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

a を使用し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)));

上記のコードのバグに注意してください。

于 2009-05-07T00:06:07.130 に答える
1

他の状態を発生させる他の があると仮定するとQPushButton、それらを の中に入れることができます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 ;
   }
}
于 2009-05-06T23:43:56.497 に答える