Qt 4.0信号和槽与最小的OOP

Qt 4.0 Signals and Slots with minimal OOP

本文关键字:OOP 信号 Qt      更新时间:2023-10-16

我对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));