[英]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.