从qlistwidget和qtableWidget获得单击项目

Get clicked item from QListWidget and QTableWidget

本文关键字:单击 项目 qtableWidget qlistwidget      更新时间:2023-10-16

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

不要将SLOT/SIGNAL语法用于C 信号和插槽。这很容易发生,因为在汇编过程中不会捕获此类错误。您的代码编译良好但不起作用。

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

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

connect调用是错误的。如果使用信号 - 插槽语法,则插槽必须是一个函数(这是对函数的"引用"(。

您可以做这样的事情:

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

onItemClicked实现:

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

感谢您的建议,但是我通过在我的UI窗口上右键右键访问了" 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());
}

,这使我能够获取各个项目。无论哪种方式,再次感谢您的帮助!