繁体   English   中英

从QListWidget和QTableWidget获取点击的项目

[英]Get clicked item from QListWidget and 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 ++信号和插槽使用SLOT / SIGNAL语法。 这很容易出错,因为在编译过程中不会捕获此类错误。 您的代码可以正常编译,但是不起作用。

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

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

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

您可以执行以下操作:

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());
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM