Получить выбранный элемент из QListWidget и QTableWidget - PullRequest
0 голосов
/ 13 мая 2019

Мне нужно прочитать элемент из QTableWidged и Q ListWidget, когда пользователь нажимает на них.

Для QListWidget я пробовал решение, описанное здесь , однако использованное SIGNAL itemClicked никогдакажется, срабатывает.

Для QTableWidget я пробовал несколько решений, однако они либо не работали, либо были не тем, что мне нужно.Есть ли простое решение для QTableWidget, и я просто пропускаю что-то с решением, предоставленным для QListWidget?

Редактировать:

Мой конструктор моего MainWindow.cpp выглядит так:

MainWindow::MainWindow(QWidget *parent) :
                                      QMainWindow(parent),
                                      ui(new Ui::MainWindow)
{
     ui->setupUi(this);


     ui->TableWidget->verticalHeader()->setVisible(true);

     QTableWidget* table = ui->TableWidget;

     connect(ui->listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
         this,   SLOT(showBuchungsDetails(parseListWidgetBuchung(QListWidgetItem*))));

     QHeaderView *header = qobject_cast<QTableView *>(table)->horizontalHeader();
     connect(header, &QHeaderView::sectionClicked, [this](int logicalIndex){
         QString text = ui->TableWidget->horizontalHeaderItem(logicalIndex)->text();
         ui->lnBuchungsnummer->setText(text);

     });

}

А вот мой заголовочный файл для MainWindow:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>
#include <QFileDialog>
#include <QListWidget>
#include "TravelAgency.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionDatei_einlesen_triggered();

    void on_actionProgramm_beenden_triggered();

    void on_actionBuchungen_anzeigen_triggered();

    Customer* parseListWidgetBuchung(QListWidgetItem* item);

    Customer* parseTableWidgetBuchung(QString item);

    void showBuchungsDetails(Customer* c);

private:
    Ui::MainWindow *ui;
    TravelAgency travelagency{};
    bool inputReady = false;
    QStringList m_TableHeader;

};

#endif // MAINWINDOW_H

Редактировать 2: Я использую Qt Creator 4.8.2

Ответы [ 3 ]

3 голосов
/ 13 мая 2019

Не используйте синтаксис SLOT / SIGNAL для сигналов и слотов C ++.Это подвержено ошибкам, поскольку подобные ошибки не обнаруживаются во время компиляции.Ваш код компилируется нормально, но не работает.

Используйте синтаксис соединения Qt5.В этом случае вы можете использовать лямбду:

connect(ui->listWidget, &QListWidget::itemClicked, this, [this](QListWidgetItem* item)
{
    showBuchungsDetails(parseListWidgetBuchung(item));
});
2 голосов
/ 13 мая 2019

Вызов connect неправильный. Если вы используете синтаксис SIGNAL - SLOT, слот должен быть одной функцией (это «ссылка» на функцию).

Вы можете сделать что-то вроде этого:

connect(ui->listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
         this,   SLOT(onItemClicked(QListWidgetItem*)));

И реализация onItemClicked:

void MainWindow::onItemClicked(QListWidgetItem* item)
{
   showBuchungsDetails(parseListWidgetBuchung(item));
}
0 голосов
/ 17 мая 2019

Спасибо за предложения, но мне удалось полностью обойти систакс «connect», щелкнув правой кнопкой мыши по рассматриваемым виджетам в моем окне пользовательского интерфейса и использовать функциональность «Перейти к слоту ...» для создания

void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
    parseListWidgetBuchung(item);
}

void MainWindow::on_TableWidget_cellClicked(int row, int column)
{
    parseTableWidgetBuchung(ui->TableWidget->item(row, 0)->text());
}

, что позволило мне получить соответствующие предметы.В любом случае, еще раз спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...