【问题标题】:How get result of function from cpp file in the main.cpp?如何从 main.cpp 中的 cpp 文件获取函数结果?
【发布时间】:2018-09-04 15:36:43
【问题描述】:

我想从 QT 的 main.cpp 中的 c++ 文件中获取函数结果。

例子

.h 文件:

ifndef HOTPLUGWATCHER_GUI_H
#define HOTPLUGWATCHER_GUI_H

#include <QWidget>

class QTextBrowser;
class QSystemTrayIcon;
class QLabel;
class QPushButton;
class QToolButton;
class QDeviceWatcher;
class HotplugWatcher_GUI : public QWidget
{
    Q_OBJECT
public:
    explicit HotplugWatcher_GUI(QWidget *parent = 0);
    ~HotplugWatcher_GUI();

    void appendMessage(const QString& msg);

public slots:
    void toggleWatch();
    void showDetail(bool show);
    void slotDeviceAdded(const QString& dev);
    void slotDeviceRemoved(const QString& dev);
    void slotDeviceChanged(const QString& dev);

private:
    QDeviceWatcher *watcher;

    QLabel *state;
    QTextBrowser *msg_view;
    QPushButton *button;
    QToolButton *detail_button;
    QSystemTrayIcon *tray;
};

#endif // HOTPLUGWATCHER_GUI_H

cpp 文件:

#include "hotplugwatcher_gui.h"

#include <QtCore/QThread>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QTextBrowser>
#include <QToolButton>
#include <QSystemTrayIcon>
#include <QMessageBox>

#include "qdevicewatcher.h"

HotplugWatcher_GUI::HotplugWatcher_GUI(QWidget *parent) :
    QWidget(parent)
{
    QVBoxLayout *vbl = new QVBoxLayout(this);
    setLayout(vbl);

    state = new QLabel(this);
    //qDebug()<<state;
    button = new QPushButton(tr("Start"), this);
    detail_button = new QToolButton(this);
    detail_button->setText(tr("Detail"));
    detail_button->setCheckable(true);
    detail_button->setChecked(true);
    msg_view = new QTextBrowser(this);
    msg_view->setLineWrapMode(QTextEdit::NoWrap);

    QHBoxLayout *hbl = new QHBoxLayout(this);
    hbl->addWidget(button);
    hbl->addWidget(detail_button);

    vbl->addWidget(state);
    vbl->addLayout(hbl);
    vbl->addWidget(msg_view);

    tray = new QSystemTrayIcon(this);
    tray->show();

    watcher = new QDeviceWatcher;
    watcher->appendEventReceiver(this);
    connect(watcher, SIGNAL(deviceAdded(QString)), this, SLOT(slotDeviceAdded(QString)), Qt::DirectConnection);
    connect(watcher, SIGNAL(deviceChanged(QString)), this, SLOT(slotDeviceChanged(QString)), Qt::DirectConnection);
    connect(watcher, SIGNAL(deviceRemoved(QString)), this, SLOT(slotDeviceRemoved(QString)), Qt::DirectConnection);

    connect(button, SIGNAL(clicked()), SLOT(toggleWatch()));
    connect(detail_button, SIGNAL(toggled(bool)), SLOT(showDetail(bool)));
}

HotplugWatcher_GUI::~HotplugWatcher_GUI()
{

}

void HotplugWatcher_GUI::appendMessage(const QString &msg)
{
    msg_view->append(msg);
}

void HotplugWatcher_GUI::toggleWatch()
{
    if (watcher->isRunning()) {
        if (!watcher->stop()) {
            QMessageBox::warning(0, tr("WARNGING"), tr("Failed to stop"));
        }
        button->setText(tr("Start"));
    } else {
        if (!watcher->start()) {
            QMessageBox::warning(0, tr("WARNGING"), tr("Failed to start"));
        }
        button->setText(tr("Stop"));
    }
}

void HotplugWatcher_GUI::showDetail(bool show)
{
    msg_view->setVisible(show);
    int w = width();
    adjustSize();  //width changes
    resize(w, height());
}

void HotplugWatcher_GUI::slotDeviceAdded(const QString &dev)
{
    qDebug("tid=%#x: add %s", (quintptr) QThread::currentThreadId(), qPrintable(dev));

    state->setText("<font color=#0000ff>Add: </font>" + dev);
    tray->showMessage(tr("New device"), dev);
}

void HotplugWatcher_GUI::slotDeviceChanged(const QString &dev)
{
    qDebug("tid=%#x: change %s", (quintptr) QThread::currentThreadId(), qPrintable(dev));

    state->setText("<font color=#0000ff>Change: </font>" + dev);
    tray->showMessage(tr("Change device"), dev);
}

void HotplugWatcher_GUI::slotDeviceRemoved(const QString &dev)
{
    qDebug("tid=%#x: remove %s", (quintptr) QThread::currentThreadId(), qPrintable(dev));

    state->setText("<font color=#0000ff>Remove: </font>" + dev);
    tray->showMessage(tr("Remove device"), dev);
}

和main.cpp

#include <QApplication>
#include "hotplugwatcher_gui.h"

static HotplugWatcher_GUI *gui = 0;

#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
#define qInstallMessageHandler qInstallMsgHandler
void MsgOuput(QtMsgType type, const char *msg)
{
#else
void MsgOuput(QtMsgType type, const QMessageLogContext &, const QString& msg)
{
#endif
    Q_UNUSED(type)
    if (gui)
        gui->appendMessage(msg);
}

int main(int argc, char *argv[])
{
    qInstallMessageHandler(MsgOuput);
    QApplication a(argc, argv);

    HotplugWatcher_GUI hotplug;
    gui = &hotplug;
    hotplug.show();
    return a.exec();
}

所以这个用按钮打开的小部件,当按下“星号”按钮时,当我连接 USB 设备时,我可以在小部件上看到一些信息。

这是一个很好的开始。

但是,我不想拥有小部件,而是将接收到的数据发送到 QML 以使用。

第一个也是主要的问题,我知道调用函数是怎样的:

do_something(2,5)

函数是

int do_something (int arg1,int arg2)
{
    int res = arg1 + arg2
    return res
}

我不知道如何在我的 main.cpp 中从另一个 cpp 文件中的函数获取函数的“状态”结果:

void HotplugWatcher_GUI::slotDeviceAdded(const QString &dev)
{
    qDebug("tid=%#x: add %s", (quintptr) QThread::currentThreadId(), qPrintable(dev));

    state->setText("<font color=#0000ff>Add: </font>" + dev);
    tray->showMessage(tr("New device"), dev);
}

所以如果有人能帮助我理解我将不胜感激

感谢大家的帮助

【问题讨论】:

  • 在同一个文件中调用函数和在不同文件中调用函数没有区别。
  • 但是,其他文件中的函数都没有返回任何值,它们都被声明为void
  • 您可以在类中添加一个getState() 成员函数,并让它返回状态。

标签: c++ qt


【解决方案1】:

如果我理解正确,您希望访问类的“状态”成员。

最好的办法是在检索它的类中创建另一个函数。例如:

QLabel* HotplugWatcher_GUI::getState() const
{
   return state;
}

但这有点难看。如果您只对文本感兴趣,那么您可以这样做:

QString HotplugWatcher_GUI::getStateText() const
{
   return state->text();
}

【讨论】:

  • 好的,您可以从阅读 Qt 事件循环以及如何使用它中受益。当您调用 a.exec() 时,您正在事件循环中运行应用程序,并且您可以使用其他 QObjects 通过信号和插槽与您的热插拔观察者对话。如果您想定期轮询热插拔观察程序,请查看使用 timerEvent()。
  • 你需要一个HotplugWatcher_GUI类型的对象(例如)foo,然后像foo.getStateText()一样调用getStateText()。请吃/读一些关于标准 C++ 的教科书。
  • @Philippe,好吧,每次文本更改时,您都必须致电 HotplugWatcher_GUI::getStateText。在 Qt 中,signals and slots 是获取此类事件通知的便捷方式。
  • 谢谢 scopchanov 但这是我的问题,我不知道如何在像 qdeviceWatcher 这样的项目中使用带有标头的信号/插槽...
  • 我不知道每次我们插入简单的 USB 驱动器时在 qml 文本上写入路径会如此疯狂......
猜你喜欢
  • 2013-03-27
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多