Как отобразить QLabel внутри qwidget из активного QMdiAreaSubwindow в строке состояния? - PullRequest
0 голосов
/ 11 января 2020

У меня есть приложение, которое использует QMdiArea.

Я хочу, чтобы текст в строке состояния обновлялся, когда другой QMdiAreaSubwindow становится активным.

Таким образом, текст в строке состояния должен совпадать с Текст Qlabel внутри QWidget, который отображается внутри окна QMdiAreaSubwindow.

Но я не могу найти способ сделать это. Прямо сейчас в строке состояния отображается только текст из последнего созданного QMdiAreaSubwindow. Но он не будет обновлять текст в строке состояния (с помощью qlabel из qwidget) при выборе другого QMdiAreaSubwindow.

Как вы можете видеть на скриншоте, текст в строке состояния продолжает говорить «test2», но я хотите, чтобы оно изменилось на «текст» из активного QMdiAreaSubwindow.

enter image description here

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

1 Ответ

1 голос
/ 13 января 2020

хорошо, вы используете Qt Designer для подключения сигнала subWindowActivated к слоту on_mdiArea_subWindowActivated вашего MainWindow, дважды проверьте с помощью qDebug в вашей функции on_mdiArea_subWindowActivated, если имя выбранного субмарина окно появляется на консоли, когда вы пытаетесь изменить текущее подокно mdi, поэтому следуйте моим фрагментам кода, чтобы найти свой путь:

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

и, наконец, я заметил, что вы создаете метку в статусе bar каждый раз, когда вы пытаетесь обновить текст в нем, избегайте такой процедуры, создайте объект QLabel и добавьте его в строку состояния в качестве постоянного виджета, как показано ниже:

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