从QListWidget和QTableWidget获取点击的项目

时间:2019-05-13 02:26:08

标签: c++ qt

当用户单击它们时,我需要从QTableWidged和Q ListWidget中读取一项。

对于QListWidget,我尝试了描述的解决方法here,但是用过的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 个答案:

答案 0 :(得分:3)

请勿对C ++信号和插槽使用SLOT / SIGNAL语法。这很容易出错,因为在编译过程中不会捕获此类错误。您的代码可以正常编译,但是无法正常工作。

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

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

答案 1 :(得分:2)

connect调用是错误的。如果您使用SIGNAL-SLOT语法,则该插槽必须是单个函数(它是对该函数的“引用”)。

您可以执行以下操作:

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

还有onItemClicked实现:

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

答案 2 :(得分:0)

感谢您的建议,但是我通过在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());
}

然后我可以获取相应的物品。无论哪种方式,再次感谢您的帮助!