c++ - 如何自动更新状态栏消息?

标签 c++ qt statusbar

我正在使用Qt 5.15.1和C++创建一个简单的应用程序,该应用程序处理来自硬件的信号并显示图像和驱动程序状态。当另一个类中定义的int值更改时,我想更新状态栏消息。每当此值更改时,我希望此操作自动发生。我知道我需要信号和插槽来实现这一目标。到目前为止,我已经执行了以下操作:
信号处理

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
private:
    int status;
public slots:
    int GetStatus();
signals:
    void StatusChanged();
}
signalprocessing.cpp
SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::GetStatus()
{
    emit(StatusChanged());
    return status;    
}
主窗口
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
}
主窗口
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    ui->statusbar->showMessage(QString::number(signalProcessing->GetStatus()));
}
问题在于状态栏消息当前不会自动更新,而是设置为给定值。
如何确保它将始终显示当前状态?

最佳答案

这个想法是,您想在值实际更改时发出StatusChanged信号,而不是在调用GetStatus()时发出。因此,您需要一个SetStatus()函数,并且SignalProcessing类将需要知道何时调用它。然后,您想将该信号连接到插槽,然后更新状态栏。它可能看起来像这样:

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
    int getStatus();
    void setStatus(int value);
private:
    int status;
signals:
    void statusChanged();  // It's better to start signals with a lower case letter
}
signalprocessing.cpp
SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::getStatus()
{
    return status;    
}
void SignalProcessing::setStatus(int value)
{
    if (status != value)
    {
        status = value;
        emit statusChanged();
    }
}
主窗口
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
public slots:
    void updateStatus();
}

主窗口
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalProcessing= new SignalProcessing(this);
    connect(signalProcessing, &SignalProcessing::statusChanged, this, &MainWindow::updateStatus);
    updateStatus();
}

void MainWindow::updateStatus()
{
    ui->statusbar->showMessage(QString::number(signalProcessing->getStatus()));
}

关于c++ - 如何自动更新状态栏消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64769422/

相关文章:

c++ - 字符串到枚举模板错误

c++ - 如何在 Qt-Creator (MacOs) 上链接 Qt API 和 GStreamer

c++ - Qt/C++ 项目 VS2010 svn-commit&update .sln

swift - MacOS 在 StatusBar 上创建 ProgressBar

ios - 如何删除 "View Based Application"中的状态栏 - iOS

c++ - 返回带有持久缓冲区的字符串

C++ 回文程序总是给出 0 (false) 作为输出问题;我的代码哪里错了?

c++ - 重载 std::function 参数以匹配 lambda

Android 在隐藏后在顶部显示 Activity 标题/状态栏

C++ 带字符串参数的 Switch 大小写