C QT4:添加使用QObject实现的插槽
C++ Qt4: Add slot with QObject implementation
我通常是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(...))
所以您的实现是错误的,
您应该考虑另一种方式,例如,您以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);
}
最后一个解决方案也许是最好的方法:它是明确的,更可读的方法。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- C QT4:添加使用QObject实现的插槽