C ++ Qt4:使用QObject实现添加插槽

时间:2019-02-26 06:23:10

标签: c++ qt

总体上来说,我对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。

3 个答案:

答案 0 :(得分:0)

我认为您应该将两个信号都连接到SLOT(PrintList(QList<QObject*>)))。 在PrintList(QList<QObject*> list)中,您可以使用dynamic_cast检查其类型(BookList或ClientList),然后根据其类型打印所需的内容。

答案 1 :(得分:0)

QpushButton的

released()信号不会根据需要向插槽SLOT(PrintList(...))

发送任何参数,例如QMetaObject *

所以您的实现是错误的,

您应该考虑另一种方法,例如,获取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

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