当用户单击它们时,我需要从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
答案 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());
}
然后我可以获取相应的物品。无论哪种方式,再次感谢您的帮助!