Qt 4.0信号和槽与最小的OOP
Qt 4.0 Signals and Slots with minimal OOP
我对Qt比较陌生;我正在编写一个小程序,我不想为每个小部件制作自己的类。到目前为止,我还没有遇到太多困难,但我对信号和插槽有点困惑。我想做一个信号,触发当用户输入一个文本框(QLineEdit),并按下enter。我希望槽是一个接受用户输入的文本的函数。
到目前为止,我已经想到了这个:
textBox.connect(&textBox,SIGNAL(textBox.returnPressed()),/*What to put here?*/,processText(/*Here?*/))
如果这段代码是非常错误的,我道歉;就像我说的,我对Qt比较陌生。
信号和槽必须是QObject (/QObject子类)的方法。你不能把自由函数用作槽。这里的"最小OOP"可能意味着包含槽的QObject单例。
签名为(a, B, C)的信号也只能连接到签名为(),(a), (a, B), (a, B, C)的槽,即可以丢弃/忽略尾随参数。插槽不能有比信号更多的/其他参数,也不能在连接时将插槽参数绑定到某个值(我认为QSignalMapper涵盖了最常见的用例)。
遗憾的是,我认为没有继承就没有办法实现这一点-如果您希望文本与信号一起运行,或者在被调用的插槽中进行一些自定义处理。
如果没有,你可以使用从QLineEdit和一些我不可能知道的预先存在的插槽发出的"returnPressed"信号。
这是我使用继承的解决方案。
要创建自己的插槽,需要创建一个继承类。直接或间接从Qobject继承。
//myClass.h
#ifndef myclass_h_
#define myclass_h_
#include <QObject>
class myClass: public QObject
{
// important
Q_OBJECT;
....
public slots:
void takeText(QString p_value);
};
#endif
要从QLineEdit中获得这样的信号,还需要一些自定义
//myLineEdit.h
#ifndef mylineedit_h_
#define mylineedit_h_
#include <QLineEdit>
class myLineEdit: public QLineEdit
{
// important
Q_OBJECT;
....
public slots:
void handleReturnPressed();
signals:
void newText(QString p_value);
};
#endif
然后做这些
myLineEdit::myLineEdit()
{
connect(this, returnPressed(),
this, handleReturnPressed());
}
void myLineEdit::handleReturnPressed()
{
emit(newText(text());
}
之后,创建一个myClass对象,并将信号连接到它。
myClass * thing = new myClass();
myLineEdit* lineEdit = new myLineEdit();
connect(lineEdit, SIGNAL(newText(QString),
things, SLOT(takeText(QString));
相关文章:
- Qt VTK交互风格的信号到小部件
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 线程之间的布尔停止信号
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 有可能在信号处理程序中设置promise吗
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- c++中的oop(密码生成)
- 在条件变量中触发错误信号的频率是多少
- OOP 中的单成员指针
- 在信号处理程序中捕获C++未处理的异常并恢复应用程序
- 调试和自由执行中的信号处理
- 升压信号2将插槽传递到成员功能以断开连接
- C++函数包装器来捕获某些信号
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- Qt将信号与另一个类方法连接
- Qt 4.0信号和槽与最小的OOP