debugging 当显示QMainWindow时,在我更改QLabel文本后,QLabel文本未更新

mzaanser  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(149)

我在QLabel中设置了一个占位符为“user”。
ui->setupUi(this);之后,QLabel通过ui->label->setText("superuser");进行更改。之后不进行任何更改。
一旦QMainWindow初始化并通过mw.show();显示在main.cpp文件中,QLabel再次被设置为占位符“user”。
我试过:

  • qDebug()<<ui->label->text();ui->label->setText("superuser");之前和之后,并将一个放在QMainWindow的构造函数的末尾。结果:
user
superuser
superuser
  • 在nano中检查了mainwindow.ui,一切正常。
  • 已检查的连接:没有链接到改变QLabel的函数的连接。
  • 已检查main.cpp中是否多次触发mw->show();,一次调用。
  • 没有外螺纹从QMainWindow外部改变QLabel

下面是一个最小可重复的示例:
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

using namespace std;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->init();
    qDebug() << "afterInit" << ui->label->text();
}

void MainWindow::init()
{
    this->set_options("SuperUser");
}

void MainWindow::set_options(QString s)
{
    debugInt++;
    qDebug() << debugInt;
    qDebug() << ui->label->text();
    ui->label->setText(s);
    qDebug() << ui->label->text();
}

void MainWindow::on_actionLogout_triggered()
{
    this->set_options("User");
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtWidgets/QMainWindow>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public slots:
    void set_options(QString s);

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

private:
    void init();
    Ui::MainWindow *ui;

    int debugInt=0;

private slots:
    void on_actionLogout_triggered();
};
#endif //MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    a.setQuitOnLastWindowClosed(true);

    MainWindow w;

    w.show();

    return a.exec();
}

ui->label设置为“当前:mainwindow.ui中的“用户”。这就是我称之为placeholder的标准集合文本。
mainwindow.ui

<property name="text">
           <string>Current: user</string>

我的QDebug输出当我启动程序,然后按注销:

1
"Current: user"
"Current: SuperUser"
"afterInit "Current: SuperUser"
2
"Current: user"
"Current: User"

如您所见,默认情况下,ui->label设置为“当前:user”。在init进程中,它被覆盖为“Current:超级用户”。但是当我启动程序时,它显示为“当前:只要我点击actionLogoutmainwindow_ui中的menubarbutton),ui->label就会被设置为“当前:用户”并显示为正确。

**注意:**我用给定的代码创建了一个新程序。ui->label正常工作,在我的代码中没有在任何其他函数中进行更改。

8nuwlpux

8nuwlpux1#

我发现了错误。我已经覆盖了MainWindow::changeEvent(QEvent* event)方法:
mainwindow.cpp

void MainWindow::changeEvent(QEvent* event)
{
  if(0 == event) return;

  switch(event->type())
  {
  case QEvent::LanguageChange: ui->retranslateUi(this); break;

  case QEvent::LocaleChange: break;

  default: break;
  }

  QMainWindow::changeEvent(event);

  }
    • Fix:**

我在QMainWindow::changeEvent(event)之前添加ui->label->setText( tr("Current: ") + currentUserString );,因为当执行MainWindow::changeEvent(QEvent* event)时,QLabel被更改为. qm/. ts转换文件中的设置字符串。这就是为什么主窗口显示我“当前:用户”(来自翻译文件),而不是“当前:SuperUser”(在init函数中更改)
mainwindow.cpp

void MainWindow::changeEvent(QEvent* event)
{
  if(0 == event) return;

  switch(event->type())
  {
  case QEvent::LanguageChange: ui->retranslateUi(this); break;

  case QEvent::LocaleChange: break;

  default: break;
  }

  if(uiIsSetUp) //bool that get set true after `ui->setupUi(this);`
    ui->label->setText( tr("Current: ") + currentUserString );

  QMainWindow::changeEvent(event);

  }

相关问题