2015-06-03 4 views
0

У меня QLineEdit с и QCheckBox ES QVector S - У меня также есть QPushButtonQVector, который при нажатии элемента, соответствующего QLineEdit и QCheckBox также удалены.Qt - У меня QVushButton QVector, который был нажат?

Как узнать, какая кнопка была нажата, чтобы определить, какой индекс удалить? В настоящее время я просто использую Checkbox es прямо сейчас, что легко, но немного громоздко по моему вкусу.

ответ

2

Простым способом является использование QObject::sender() в слоте для нажатия кнопки, чтобы узнать, какая кнопка выдала сигнал. Затем вы должны перебрать вектор кнопок:

QObject* obj = sender(); 
for(int i=0;i<buttonVector.count();i++) 
{ 
    if(obj == qobject_cast<QObject *>(buttonVector[i])) 
    { 
     ... 
    } 
} 

Один из способов заключается в использовании QObject::setObjectName и установить некоторые имена кнопок вы добавляете:

button.setObjectName(QString("%1").arg(i)); 

И в слоте вы можете получить номер кнопки используя имя объекта:

void MainWindow::buttonClicked() 
{ 
    QPushButton *button = qobject_cast<QPushButton *>(QObject::sender()); 

    int number = button->objectName().toInt(); 
} 

Другой способ заключается в использовании QSignalMapper класс, который собирает набор сигналов без параметров, и повторно излучает их с г nteger, string или widget, соответствующие объекту, который отправил сигнал. Таким образом, вы можете иметь один, как:

QSignalMapper * mapper = new QSignalMapper(this); 
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int))); 

Когда newing ваши кнопки, вы можете подключить clicked() сигнал кнопки на map() слот QSignalMapper и добавить отображение с помощью setMapping так, что, когда clicked() сигнализируется с помощью кнопки, сигнал mapped(int) испускается:

button = new QPushButton(); 

QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map())); 
mapper->setMapping(button, i); 

Таким образом, при нажатии кнопки, mapped(int) сигнала преобразователя испускается, содержащим номер кнопки и, следовательно, buttonClicked называется остроумием h - параметр, содержащий номер кнопки.

+1

Существует также QButtonGroup, хотя для этого варианта использования сопоставим с QSignalMapper –

+0

QSignalMapper - прекрасное решение, которое мне удалось реализовать. Единственное, что мне показалось немного раздражающим, это тот факт, что если я удалю кнопку, мне придется управлять сопоставлениями вручную, поскольку mapping-> removeMapping() не изменяет размер. Спасибо @ Негат! – lachycharts