Получить индекс 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" 

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

  • как преобразовать opencv cv :: Mat в qimage
  • Рисование прямоугольного наложения на QWidget при щелчке
  • Qt: Лучшая практика защиты одного экземпляра приложения
  • Qt-сигналы (QueuedConnection и DirectConnection)
  • Неопределенная ссылка на vtable. Попытка скомпилировать проект Qt
  • Управление памятью в Qt?
  • cv :: Mat to QImage и обратно
  • Внедрение проекта Qt через CMake
  • qfiledialog - Фильтрация папок?
  • Как нарисовать точку (на mouseclick) на QGraphicsScene?
  • Как сделать текст представления рендеринга богатым (html) текстом в Qt
  • Interesting Posts

    Есть ли команда в Mac OS X (10.8), эквивалентная «iptables»?

    Как получить информацию об ошибках MySQLi в разных средах

    Изменение шрифтов в ggplot2

    Пароль wifi хранится где-то в Windows 7?

    Синхронизация двух каталогов на компьютере linux

    Соответствующие номера с регулярными выражениями – только цифры и запятые

    Ресурс API для облачных сообщений Firebase

    Как отключить AFP для использования SMB в Finder по умолчанию в Mac OS X 10.11 (El Capitan)?

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

    Как открыть несколько вкладок в IE8 из командной строки?

    В чем смысл геттеров и сеттеров?

    Фоновая задача, диалог прогресса, изменение ориентации – есть ли 100% рабочее решение?

    Лучший способ протестировать приложение MS Access?

    Циклическая ссылка, вызывающая переполнение стека с помощью Automapper

    Может ли class C # наследовать атрибуты из своего интерфейса?

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