首页 > 解决方案 > 从 QListWidget 和 QTableWidget 获取点击的项目

问题描述

当用户点击它们时,我需要从 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

标签: c++qt

解决方案


不要对 C++ 信号和槽使用SLOT/SIGNAL语法。这很容易出错,因为这样的错误在编译期间不会被捕获。您的代码编译得很好,但不起作用。

使用 Qt5 连接语法。在这种情况下,您可以使用 lambda:

connect(ui->listWidget, &QListWidget::itemClicked, this, [this](QListWidgetItem* item)
{
    showBuchungsDetails(parseListWidgetBuchung(item));
});

推荐阅读