簡體   English   中英

如何自動更新狀態欄消息?

[英]How to automatically update a statusbar message?

我正在使用 Qt 5.15.1 和 C++ 創建一個簡單的應用程序,該應用程序處理來自硬件的信號並顯示圖像和驅動程序狀態。 我想在另一個類中定義的 int 值更改時更新狀態欄消息。 我希望每次此值更改時自動發生這種情況。 我知道我需要信號和插槽來實現這一點。 到目前為止,我已經完成了以下工作:

信號處理.h

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
private:
    int status;
public slots:
    int GetStatus();
signals:
    void StatusChanged();
}

信號處理.cpp

SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::GetStatus()
{
    emit(StatusChanged());
    return status;    
}

主窗口.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
}

主窗口.cpp

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
}

信號處理.cpp

SignalProcessing::SignalProcessing(QObject *parent)
: QObject(parent)
{
}
int SignalProcessing::getStatus()
{
    return status;    
}
void SignalProcessing::setStatus(int value)
{
    if (status != value)
    {
        status = value;
        emit statusChanged();
    }
}

主窗口.h

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow();
    SignalProcessing *signalProcessing;
public slots:
    void updateStatus();
}

主窗口.cpp

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()));
}

首先更改單個聲明,以便它提供新值:

class SignalProcessing: public QObject
{
    Q_OBJECT
public:
    SignalProcessing(QObject *parent = nullptr);
private:
    int status;
public slots:
    int setStatus(int value);
signals:
    void statusChanged(const QString& message);
}

void SignalProcessing::setStatus(int value)
{
    if (status != value)
    {
        status = value;
        emit statusChanged(tr("Status is %1").arg(status));
    }
}

然后將此信號連接到QStatusBar::showMessage插槽,您就完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM