Qt4 существующие слоты не распознаются - PullRequest
0 голосов
/ 28 апреля 2009

В настоящее время я пытаюсь завершить проект с использованием 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")));

Ответы [ 4 ]

6 голосов
/ 28 апреля 2009

Вы не можете передать аргумент (буквально) в слот append () при создании соединения с слотом.

Вы ссылаетесь на него как на сигнатуру метода:

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

Если вам нужно, чтобы текстовое поле добавляло слова «состояние перемещения» при каждом нажатии этой кнопки, вам следует определить свой собственный слот, который будет добавлять.

4 голосов
/ 28 апреля 2009

У Криса это в двух словах.

Это одна из многих причин, по которым мне больше нравится Boost :: сигналы (вам разрешено использовать boost :: bind). В основном вам нужно будет создать другую функцию, которая захватывает сигнал и затем выполняет добавление.

...

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

...

void MyTextEdit::MoveState()
{
    append("move state");
}
3 голосов
/ 07 мая 2009

Используйте 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)));

Остерегайтесь ошибок в приведенном выше коде.

1 голос
/ 07 мая 2009

Если у вас есть другие 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 ;
   }
}
...