如何从状态栏中的活动 QMdiAreaSubwindow 在 qwidget 中显示 QLabel?

How to display QLabel inside qwidget from active QMdiAreaSubwindow in statusbar?

我有一个使用 QMdiArea 的应用程序。

我希望状态栏中的文本在另一个 QMdiAreaSubwindow 激活时更新。

因此状态栏中的文本应该与显示在 QMdiAreaSubwindow 中的 QWidget 中的 Qlabel 文本相同。

但是我找不到办法做到这一点。现在状态栏只显示来自最新创建的 QMdiAreaSubwindow 的文本。 But it won't update the text in the statusbar(With qlabel from the qwidget) when another QMdiAreaSubwindow is selected.

如您在屏幕截图中所见,状态栏中的文本一直显示“test2”,但我希望它从活动的 QMdiAreaSubwindow 更改为“文本”。

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <newwindow.h>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow 
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void NewSubWindow(QString name);

    void createStatusBar(QString name);

private slots:

    void on_actionNew_triggered();

    void on_mdiArea_subWindowActivated(QMdiSubWindow *arg1);

private:
    Ui::MainWindow *ui;

    NewWindow *nDialog;
};

#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mdisubwidget.h"
#include "newwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    nDialog = new NewWindow();
    connect(nDialog,&NewWindow::transmit,this,&MainWindow::NewSubWindow);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::NewSubWindow(QString name) {

    // new Widget to add to mdiareasubwindow
    mdisubwidget *mdiwidget = new mdisubwidget();
    mdiwidget->addName(name);
    mdiwidget->setWindowTitle(name);

    // Create new mdiAreaSubWindow
    ui->mdiArea->addSubWindow(mdiwidget);

    // Show mdiArea
    mdiwidget->show();
}

void MainWindow::on_actionNew_triggered()
{
    nDialog->show();
}

void MainWindow::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)
{
    mdisubwidget *mdiwidget = new mdisubwidget(arg1->widget());
    qDebug() << "name" << mdiwidget->returnName();
    createStatusBar(mdiwidget->returnName());
}

void MainWindow::createStatusBar(QString name)
{
    statusBar()->showMessage("chart = "+name);
}

mdisubwidget.h

#ifndef MDISUBWIDGET_H
#define MDISUBWIDGET_H

#include <QWidget>

namespace Ui {
    class mdisubwidget;
}

class mdisubwidget : public QWidget
{
    Q_OBJECT

public:
    explicit mdisubwidget(QWidget *parent = nullptr);
    void addName(QString name);
    QString returnName();
    ~mdisubwidget();

private:
    Ui::mdisubwidget *ui;
};

#endif // MDISUBWIDGET_H

mdisubwidget.cpp

#include "mdisubwidget.h"
#include "ui_mdisubwidget.h"
#include "mainwindow.h"

QString currentName;

mdisubwidget::mdisubwidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mdisubwidget)
{
    ui->setupUi(this);
}

void mdisubwidget::addName(QString name) {
    ui->label_2->setText(name);
    currentName = name;
}

QString mdisubwidget::returnName() {

    return currentName;
}

mdisubwidget::~mdisubwidget()
{
    delete ui;
}

NewWindow.h:

#ifndef NEWWINDOW_H
#define NEWWINDOW_H

#include <QWidget>

namespace Ui {
    class NewWindow;
}

class NewWindow : public QWidget
{
    Q_OBJECT

public:
    explicit NewWindow(QWidget *parent = nullptr);
    ~NewWindow();

signals:
    void transmit(QString name);

private slots:
    void on_pushButton_clicked();

private:
    Ui::NewWindow *ui;
};

#endif // NEWWINDOW_H

NewWindow.cpp:

#include "newwindow.h"
#include "ui_newwindow.h"
#include "mainwindow.h"

NewWindow::NewWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::NewWindow)
{
    ui->setupUi(this);
}

NewWindow::~NewWindow()
{
    delete ui;
}

void NewWindow::on_pushButton_clicked()
{
    QString name = ui->lineEdit->text();
    emit transmit(name);
}

好的,您正在使用 Qt Designer 将 subWindowActivated 的信号连接到 MainWindowon_mdiArea_subWindowActivated 插槽,仔细检查 qDebug 在您的 on_mdiArea_subWindowActivated 如果您选择的子 window 的名称出现在您尝试更改当前 mdi 子 window 的控制台上,请按照我的代码片段找到您的方法:

connect(ui->mdiArea, &QMdiArea::subWindowActivated, this, &DesignerWindow::activeViewChanged);

activeViewChanged():

void DesignerWindow::activeViewChanged(QMdiSubWindow *activeSubWindow)
{
    // checks if there is no active sub window defined or the number of subwindows
    // are zero then return
    if (!activeSubWindow)
        return;
    if (ui->mdiArea->subWindowList().count() == 0) {
        ui->itemsTree->clear();
        return;
    }

    // defines the current Midi, View and graphical Scene when current sub window changes
    currentMidi = reinterpret_cast<MidiWindow*>(activeSubWindow->widget());
    currentView = reinterpret_cast<HMIView*>(currentMidi->internalView());
    currentScene = reinterpret_cast<HMIScene*>(currentMidi->internalScene());

    ItemsToolBar::ItemType currentType = currentScene->itemType();
    itemsToolBar->selectItemType(currentType);

    // updates the widgets and labels in status bar related to current midi sub window
    updateScale(currentView->zoomFactor() * 100);
    updateSelected();
    updateItemsTree();
    updateRendererType();
}

例如,为了更新状态栏中包含当前 mdiSubWindow 缩放因子的标签,我编写了 updateScale 程序如下:

void DesignerWindow::updateScale(double _scale)
{
    scale = static_cast<int>(_scale);
    scaleLbl->setText(QString("%1%").arg(scale));
}

最后我注意到您每次尝试更新其中的文本时都会在状态栏中创建一个标签,请避免这样的过程并创建一个 QLabel 对象并将其作为如下所示的永久小部件:

scaleLbl = new QLabel(this);
scaleLbl->setFrameStyle(QFrame::Sunken | QFrame::Panel);
scaleLbl->setMinimumWidth(50);
statusBar()->addPermanentWidget(scaleLbl);