总体上来说,我对Qt还是很陌生,我想在编写用于打印对象列表的通用方法时使用某种程度的反思。
我目前正试图像这样连接到ui:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <algorithm>
#include <QStringListModel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
...
connect(ui->print_books_btn, SIGNAL(released()), this, SLOT(PrintList(BookList)));
connect(ui->print_clients_btn, SIGNAL(released()), this, SLOT(PrintList(ClientList)));
}
...
void MainWindow::PrintList(QList<QMetaObject*> list)
{
list.first()->className();
}
我相关的头文件如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
...
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
...
private:
Ui::MainWindow *ui;
QList<Book*> BookList;
QList<Client*> ClientList;
private slots:
...
void PrintList(QList<QMetaObject*> list);
};
#endif // MAINWINDOW_H
我相信我已经对头文件中的Q_OBJECT宏进行了所有设置:
...
class Book : public QObject
{
Q_OBJECT
public:
Book();
...
}
所有内容都能正确编译,尽管在运行时我可以在控制台中找到它:
QObject::connect: No such slot MainWindow::PrintList(BookList) in ..\LibraryManager\mainwindow.cpp:18
QObject::connect: (sender name: 'print_books_btn')
QObject::connect: (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::PrintList(ClientList) in ..\LibraryManager\mainwindow.cpp:19
QObject::connect: (sender name: 'print_clients_btn')
QObject::connect: (receiver name: 'MainWindow')
是否可以这种方式工作? 谢谢!
更新
我认为它实际上是我要使用的QMetaObject
-因此我可以进行list.first()->className()
等。编辑以上^
更新2
必须使用Qt4。
答案 0 :(得分:0)
我认为您应该将两个信号都连接到SLOT(PrintList(QList<QObject*>)))
。
在PrintList(QList<QObject*> list)
中,您可以使用dynamic_cast检查其类型(BookList或ClientList),然后根据其类型打印所需的内容。
答案 1 :(得分:0)
released()
信号不会根据需要向插槽SLOT(PrintList(...))
所以您的实现是错误的,
您应该考虑另一种方法,例如,获取QPushButton的released()
[或clicked()
]信号并将其连接到类中的另一个插槽,例如buttonsClicked()
,然后在实现{ {1}}插槽中,您应该手动发出信号,例如要在另一个插槽buttonsClicked()
中接收书本或客户列表之类的参数
这就是Qt中信号和插槽的工作方式。插槽仅接收信号发出的参数,而不接收其他任何参数。
答案 2 :(得分:0)
在Qt5中,您可以在container_handler<int>();
方法中使用lambda函数将参数传递到您的广告位:
QObject::connect
您还可以使用connect(ui->print_books_btn, &QPushButton::clicked, [=] { PrintList(BookList); });
类在Qt4中执行相同的操作(请参见doc)。或者,您可以创建两个特定的插槽:
QSignalMapper
最后一个解决方案也许是最好的方法:它是明确的并且更具可读性。