【问题标题】:How to display QLabel inside qwidget from active QMdiAreaSubwindow in statusbar?如何在状态栏中的活动 QMdiAreaSubwindow 中显示 qwidget 内的 QLabel?
【发布时间】:2020-04-28 20:54:26
【问题描述】:

我有一个使用 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 更改为“文本”。

主窗口.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

主窗口.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);
}

【问题讨论】:

    标签: c++ qt qmdiarea


    【解决方案1】:

    好的,您正在使用 Qt Designer 将subWindowActivated 的信号连接到您的MainWindowon_mdiArea_subWindowActivated 的插槽,如果您选择的子名称,请在您的on_mdiArea_subWindowActivated 函数中仔细检查qDebug当您尝试更改当前的 mdi 子窗口时,控制台上会出现窗口,因此请按照我的代码 sn-ps 找到您的方式:

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

    【讨论】:

    • 非常感谢!!现在我明白了!。现在我可以在我的子窗口中读取连接到实际的小部件! currentMidi = reinterpret_cast(activeSubWindow->widget());
    • 感谢您注意到我的状态栏错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多