Перехват/подключение QPushButton внутри QTableWidget к функции
-
13-12-2019 - |
Вопрос
Я студент-разработчик, использующий Qt для создания графического пользовательского интерфейса, помогающего пользователям отображать определенные столбцы данных, расположенные в нескольких файлах.Функция, которую я настраиваю, позволяет пользователям выбирать файл с помощью кнопки в каждой строке.Таким образом, изначально на кнопке будет написано «Обзор», а затем пользователь нажимает ее, чтобы открыть диалоговое окно для выбора файла, после чего текст кнопки заменяется выбранным именем файла.Извините за историю;моя простая попытка внести некоторую ясность.
Проблема, с которой я столкнулся, заключается в том, что я не знаю, как настроить политику для нажатия кнопки.Я предполагаю, что мне придется расширить функциональность каждого QPushButton, но я не знаю, как это сделать.До сих пор я использую следующее для установки виджета ячейки.
//with row count set dimensions are set becasue column count is static
//begin bulding custom widgets/QTableWidgetItems into cells
for(int x = 0; x < ui->tableWidgetPlotLineList->rowCount(); x++)
{
for(int y = 0; y < ui->tableWidgetPlotLineList->columnCount(); y++)
{
if(y == 1)
{
//install button widget for file selection
QPushButton *fileButton = new QPushButton();
if(setDataStruct.plotLineListData.at(rowCount).lineFileName != "");
{
fileButton->setText(setDataStruct.plotLineListData.at(rowCount).lineFileName);
}
else
{
fileButton->setText("Browse...");
}
ui->tableWidgetPlotLineList->setCellWidget(x, y, fileButton);
}
Я думал, что
connect(ui->tableWidgetPlotLineList->row(x), SIGNAL(fileButton->clicked()), this, SLOT(selectPlotLineFile(x));
может помочь, но я думаю, что, вероятно, иду в неправильном направлении.Честно говоря, я даже не совсем уверен, куда это приведет...
Большое спасибо за прочтение моего поста.Пожалуйста, дайте мне знать, если в этом посте чего-то не хватает, и я немедленно обновлю его.Я также хотел бы заранее поблагодарить всех, кто внес свой вклад в этот пост!
Решение
connect(ui->tableWidgetPlotLineList->row(x), SIGNAL(fileButton->clicked()), this, SLOT(selectPlotLineFile(x));
Не является синтаксически правильным для соединения сигнала/слота.Более уместно было бы что-то вроде этого:
connect(fileButton, SIGNAL(clicked()), this, SLOT(selectPlotLineFile(x));
...
Если вам нужен доступ к конкретной кнопке, которая emit
Ред. clicked()
сигнал, чем вы могли бы использовать sender()
функция в вашем слоте:
void selectPlotLineFile() {
QPushButton *button = dynamic_cast<QPushButton*>( sender() )
}
Теперь вам может быть интересно, как узнать, над какой строкой работать.Существует несколько различных подходов, один из самых простых – поддерживать QMap<QPushButton*, int>
переменная-член, которую можно использовать для поиска, какая кнопка принадлежит какой строке.