c++ - 无法将信号连接到 main() 内的函数

标签 c++ qt user-interface qt4

我知道要在类中使用 Qt 的信号和槽机制,该类必须包含 Q_OBJECT 宏,但我试图在 main( ),不使用任何类。

到目前为止,这是我的代码:

#include <QApplication>
#include <QWidget>
#include <QTextEdit>
#include <QtGui>

void saveText();

int main(int argv, char **args)
 {
    QApplication app(argv, args);
    QTextEdit textEdit;
    QPushButton saveButton("Save!");
    QPushButton exitButton("Exit!");
    QObject::connect(&exitButton,SIGNAL(clicked()),qApp,SLOT(quit()));
    QObject::connect(&saveButton,SIGNAL(clicked()),qApp,SLOT(saveText()));

    QVBoxLayout vlyt;
    vlyt.addWidget(&textEdit);
    vlyt.addWidget(&exitButton);
    vlyt.addWidget(&saveButton);

    QWidget mainWindow;
    mainWindow.setLayout(&vlyt);
    mainWindow.show();

    return app.exec();
}

void saveText()
{
    exit(0);
}

这是生成的 GUI 窗口:

GUI window

从上面的代码中,退出按钮连接到 quit(),这是一个 Qt 函数,单击时它会起作用。分配给函数 saveText() 的保存按钮被配置为退出,但实际上并没有退出。

请告诉我在理解 Qt 中的信号和槽时哪里出错了。

最佳答案

Qt4...

All classes that inherit from QObject or one of its subclasses (e.g., QWidget) can contain signals and slots.1

因此,您不能使用放置在 QObject 子级之外的插槽。

您可以将信号连接到从 QObject 派生的类中的槽。将您的插槽放在一个单独的 .h/.cpp 文件中的类中:

class MyClass : public QObject
{
   Q_OBJECT

   ...

   public slots:
     void saveText();

};

根据 Qt5:New Signal Slot Syntax in Qt 5 .您可以连接到那些类型的全局函数。 (感谢@thuga 的评论)

关于c++ - 无法将信号连接到 main() 内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16734542/

相关文章:

c++ - OpenCV 中的直方图函数

c++ - 将一个线程与两个正在运行的线程同步,c++,windows

c++ - Qt5:使用 QSortFilterProxyModel 时拖放

qt - 滚动 QML 网格

java - 如何更新线程内的 JFrame 标签? - java

windows - 如何实现全屏模式?

c# - 从 ATL 到 C# 的 WebBrowser 控件

c++ - 在 C++ 中对一对 vector 进行排序

c++ - 有什么类似于 boost::asio 中的 QSocketNotifier 吗?

java - JFrame 标题不会正确对齐