【问题标题】:How to update QWindow in qt c++, text doesn't show如何在 qt c++ 中更新 QWindow,文本不显示
【发布时间】:2020-08-27 14:54:20
【问题描述】:

我正在编写 QT 桌面应用程序,但遇到了一个小问题。 我想用我从文件中放入的文本打开新标签。

我在 mainwindow.h 中有两个类,第一类在 form.h 中

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void on_open_file_clicked();

    void on_search_keyword_clicked();

    void on_search_tag_clicked();

    void on_tabWidget_tabCloseRequested(int index);

    void show_tab(QString keywords);
    QString return_text();
public:
    Ui::MainWindow *ui;

private slots:
    void on_actionOpen_file_triggered();
    void on_actionShow_text_file_triggered();
    QVector<QString>find_logs_keywords(QString keywords);
private:
    QString  text = "example text";
};
#endif // MAINWINDOW_H

form.h

    #ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

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

public slots:
    void on_pushButton_2_clicked();
    void text_to_plain(QString& text);

private:
    Ui::Form *ui;
};

#endif // FORM_H

ma​​inwindow.cpp

    #include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QDir>
#include <QVector>
#include <QStringList>
#include <iostream>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "search_keyword.h"
#include "search_tag.h"
#include "form.h"

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

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

void MainWindow::on_open_file_clicked()
{
    QString filter = "log file (*log) ;; Tex File (*.txt)";
    QString file_name = QFileDialog::getOpenFileName(this, "Open a file", QDir::homePath(), filter);
    QMessageBox::information(this,"..",file_name);
    QFile file(file_name);


    if (!file.open(QFile::ReadOnly | QFile::Text)) QMessageBox::warning(this,"title","file not open");
    else
    {
    QTextStream in(&file);
    text = in.readAll();
    ui->plainTextEdit->setPlainText(text);
    ui->lineEdit->setPlaceholderText(file_name);
    }

    file.close();

}

void MainWindow::on_actionShow_text_file_triggered()
{
    show_tab("all logs");
    Form Fr;
    Fr.text_to_plain(text);
}

void MainWindow::show_tab(QString keywords)
{
    ui->tabWidget->addTab(new Form(), QString("%1").arg(keywords));
    ui->tabWidget->setCurrentIndex(ui->tabWidget->count()-1);
}

form.cpp

#include "form.h"
#include "ui_form.h"

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

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

void Form::text_to_plain(QString& text)
{
    ui->plainTextEdit->setPlainText(text);
}

我的问题是在调用方法 void MainWindow::on_actionShow_text_file_triggered() 后,Form QWidget 中的纯文本仍然是空的,我试过:this->update, this->repaint, Form::update(); Form::repaint(), QWidget::repaint(); QWidget::update();。一切都失败了。

【问题讨论】:

  • 当你说一切都失败时,会发生什么。请详细说明。你能分享你尝试过的步骤吗?你能分享编译器/运行时错误吗?你在什么平台上运行这个。 Linux / Mac / Windows ?欢迎使用 stackoverflow!
  • 失败是指它不起作用。什么也没发生,QWidget 为空,文本不显示。

标签: c++ qt qwidget


【解决方案1】:

问题是你的表单只存在于这个函数范围内。

void MainWindow::on_actionShow_text_file_triggered()
{
    show_tab("all logs");
    Form Fr;
    Fr.text_to_plain(text);
}

这里 -> Form Fr; Form 被创建:Form 类的构造函数(explicit Form(QWidget *parent = nullptr);) 被调用

在这个地方 -> } 你的 Form 被删除:调用 Form 类的析构函数(~Form();)。 发生这种情况是因为您在函数堆栈上创建了 Form 实例。所以 Fr 是局部对象,只存在于函数on_actionShow_text_file_triggered() 的范围内,函数执行/完成后,所有局部变量都被释放/销毁。

如果你的Fr 对象不应该只存在于这个函数中,你需要在堆而不是堆栈上创建它。 P.S.:对于案例研究,请阅读有关堆栈与堆的信息,例如听到:What and where are the stack and heap?

您的on_actionShow_text_file_triggered 函数应如下所示:

void MainWindow::on_actionShow_text_file_triggered()
{
    show_tab("all logs");
    Form * Fr = new Form(this); //if you set parent object your Form will be automatically deleted/destructed then MainWindow is deleted/destructed
    Fr->text_to_plain(text);
    Fr->show(); // you should call show() function of QWidget class and subclasses to get your widget visible
}

【讨论】:

  • 我稍微改变一下你的回答:void MainWindow::on_actionShow_text_file_triggered() { Form *Fr = new Form(this); Fr-&gt;text_to_plain(text); show_tab("all logs", Fr); } 和:void MainWindow::show_tab(QString keywords, Form *f) { ui-&gt;tabWidget-&gt;addTab(f, QString("%1").arg(keywords)); ui-&gt;tabWidget-&gt;setCurrentIndex(ui-&gt;tabWidget-&gt;count()-1); } 因为小部件没有正确显示。
【解决方案2】:

这个Form * Fr = new Form(this); 每次都会创建新的表单指针。创建一个指向表单的全局指针,调用函数并稍后将其删除不是更好吗?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多