Получить индекс QPushButton на 2D-массиве QPushButton

У меня есть 2D-массив QPushButton , как я могу получить индекс кнопки, когда пользователь нажимает на нее? например, когда пользователь нажимает кнопку a[2][3] он покажет (2,3) ?

Пример выглядит следующим образом:

Скриншот

Qt 4/5 Использование имен объектов

Вы можете дать своим кнопкам уникальные имена объектов. Имена в идеале должны быть действительными идентификаторами C ++.

 // https://github.com/KubaO/stackoverflown/tree/master/questions/button-grid-22641306 #include  #if QT_VERSION_MAJOR >= 5 #include  #endif struct Display : QLabel { Q_SLOT void onClicked() { auto const elements = sender()->objectName().split('_'); auto const i = elements.at(1).toInt(); auto const j = elements.at(2).toInt(); setText(QString{"(%1,%2)"}.arg(i).arg(j)); } Q_OBJECT }; int main(int argc, char *argv[]) { QApplication a{argc, argv}; QWidget window; QGridLayout layout{&window}; QVarLengthArray buttons(12); Display display; const int rows = 4, columns = 3; for (int i = 0; i < rows; ++ i) for (int j = 0; j < columns; ++j) { auto & button = buttons[i*columns+j]; button.setText(QString{"(%1,%2)"}.arg(i).arg(j)); button.setObjectName(QString{"buton_%1_%2"}.arg(i).arg(j)); layout.addWidget(&button, i, j); display.connect(&button, SIGNAL(clicked()), SLOT(onClicked())); } layout.addWidget(&display, rows, 0, 1, columns); window.show(); return a.exec(); } #include "main.moc" 

Qt 5 - Использование Lambdas

В Qt 5 и C ++ 11 вы должны использовать функторы для создания пользовательского слота для каждой кнопки, на лету. Например:

 // https://github.com/KubaO/stackoverflown/tree/master/questions/button-grid-22641306 #include  int main(int argc, char *argv[]) { QApplication a{argc, argv}; QWidget window; QGridLayout layout{&window}; QVarLengthArray buttons(12); QLabel display; const int rows = 4, columns = 3; for (int i = 0; i < rows; ++ i) for (int j = 0; j < columns; ++j) { auto text = QStringLiteral("(%1,%2)").arg(i).arg(j); auto & button = buttons[i*columns+j]; button.setText(text); layout.addWidget(&button, i, j); QObject::connect(&button, &QPushButton::clicked, [&display, text] { display.setText(text); }); } layout.addWidget(&display, rows, 0, 1, columns); window.show(); return a.exec(); } 

Qt 4/5 - Использование QSignalMapper

QSignalMapper в значительной степени предназначен для того, что вы хотите. Это позволяет вам сопоставить QObject* с «чем-то другим», например, с строкой. Например:

 #include  #if QT_VERSION_MAJOR >= 5 #include  #endif int main(int argc, char *argv[]) { QApplication a{argc, argv}; QSignalMapper mapper; QWidget window; QGridLayout layout{&window}; QVarLengthArray buttons(12); QLabel display; const int rows = 4, columns = 3; for (int i = 0; i < rows; ++ i) for (int j = 0; j < columns; ++j) { auto text = QString{"(%1,%2)"}.arg(i).arg(j); auto & button = buttons[i*columns+j]; button.setText(text); layout.addWidget(&button, i, j); mapper.connect(&button, SIGNAL(clicked()), SLOT(map())); mapper.setMapping(&button, text); } display.connect(&mapper, SIGNAL(mapped(QString)), SLOT(setText(QString))); layout.addWidget(&display, rows, 0, 1, columns); window.show(); return a.exec(); } 

Qt 4/5 - Использование системы собственности

Вы можете использовать тот факт, что QWidget является QObject . QObjects имеют систему свойств, поэтому вы можете установить индекс каждой кнопки в качестве свойства, а затем извлечь ее в слот, подключенный к сигналу clicked() . Например:

 #include  #if QT_VERSION_MAJOR >= 5 #include  #endif const char kIndex[] = "index"; struct Display : QLabel { Q_SLOT void onClicked() { setText(sender()->property(kIndex).toString()); } Q_OBJECT }; int main(int argc, char *argv[]) { QApplication a{argc, argv}; QWidget window; QGridLayout layout{&window}; QVarLengthArray buttons(12); Display display; const int rows = 4, columns = 3; for (int i = 0; i < rows; ++ i) for (int j = 0; j < columns; ++j) { auto index = QString{"(%1,%2)"}.arg(i).arg(j); auto & button = buttons[i*columns+j]; button.setText(index); button.setProperty(kIndex, index); layout.addWidget(&button, i, j); display.connect(&button, SIGNAL(clicked()), SLOT(onClicked())); } layout.addWidget(&display, rows, 0, 1, columns); window.show(); return a.exec(); } #include "main.moc" 

в общем, вам придется перебирать массив и тестировать цель события для равенства с каждым элементом, пока не достигнете правильного индекса

  • Как указать разные каталоги вывода отладки / выпуска в файле QMake .pro
  • cv :: Mat to QImage и обратно
  • Совместимость Ncurses и Qt
  • Как сообщить QWebPage не загружать определенные типы ресурсов?
  • Как сделать столбец в QTableWidget только для чтения?
  • что означает __declspec (dllimport)?
  • Разница между созданием объекта с помощью () или без
  • как перезапустить мое собственное приложение qt?
  • Как безопасно уничтожить QThread?
  • Как использовать Qt, чтобы сделать метод QObject streamобезопасным?
  • Как получить STDOUT из QProcess?
  • Interesting Posts

    Служба центра безопасности Windows не может быть запущена

    IOException: сбой чтения, сокет может быть закрыт – Bluetooth на Android 4.3

    SQLiteOpenHelper onUpgrade () Confusion Android

    Как получить список пользователей, которые вошли в систему на удаленном компьютере?

    Windows 10: переименовать закрепленные элементы в Quick Access

    Как я могу использовать новый модуль Perl без разрешения на установку?

    Как узнать, что приложение установлено из игры Google или боковой загрузки?

    Как обрабатывать файл в PowerShell по очереди в streamе

    Не показывать скрытые приложения при использовании командной строки

    Как создать схему базы данных в спящем режиме в первый раз и продолжить ее обновление в случае изменения схемы?

    Получить индекс Row в событии Rowcommand от Asp.net

    остановить службу в android

    Как загрузить и запустить версию USBView для Windows (устройство просмотра USB-устройств)?

    Как исправить «Нет перегрузки для метода» принимает 0 аргументов »?

    Cache Invalidation – существует ли общее решение?

    Давайте будем гением компьютера.