[英]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.