C QT4:添加使用QObject实现的插槽

C++ Qt4: Add slot with QObject implementation

本文关键字:QObject 实现 插槽 QT4 添加      更新时间:2023-10-16

我通常是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 ..LibraryManagermainwindow.cpp:18
QObject::connect:  (sender name:   'print_books_btn')
QObject::connect:  (receiver name: 'MainWindow')
QObject::connect: No such slot MainWindow::PrintList(ClientList) in ..LibraryManagermainwindow.cpp:19
QObject::connect:  (sender name:   'print_clients_btn')
QObject::connect:  (receiver name: 'MainWindow')

可以这样工作吗?谢谢!

update

我认为它实际上想使用的QMetaObject - 我可以做list.first()->className()等。在上面编辑 ^

更新2

需要使用QT4。

qpushbuttons的released()信号不会像您喜欢的插槽SLOT(PrintList(...))

那样发送任何参数,例如qmetaObject*

所以您的实现是错误的,

您应该考虑另一种方式,例如,您以qpushbuttons的released() [或clicked()]信号,然后将它们连接到类似buttonsClicked()的另一个插槽,然后在buttonsClicked()插槽实现时,您应该手动发出信号,该信号像BookList或BookList或BookList或BookListers或您喜欢在其他插槽PrintList(QMetaObject*)中收到的客户列表这就是信号和插槽在QT中工作的方式。插槽仅接收信号发出的参数。

我认为您应该将两个信号连接到SLOT(PrintList(QList<QObject*>)))。在PrintList(QList<QObject*> list)中,您可以使用dynamic_cast检查它是哪种类型(BookList或客户端列表),然后您可以打印所需的内容。

在QT5中,您可以在QObject::connect方法中使用lambda函数将参数传递到插槽:

connect(ui->print_books_btn, &QPushButton::clicked, [=] { PrintList(BookList); });

您也可以使用QSignalMapper类在QT4中执行相同的操作(请参阅DOC)。或者,您可以创建两个特定的插槽:

connect(ui->print_books_btn, SIGNAL(released()), this, SLOT(printBookList));
void MainWindow::printBookList()
{
    printList(bookList);
}

最后一个解决方案也许是最好的方法:它是明确的,更可读的方法。