如何在Qt C ++中更新QWindow,文本不显示

亚当·B

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

我在mainwindow.h中有两个类,而在form.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

形式

    #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

主窗口

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

表格

#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(); 形式:: repaint(),QWidget :: repaint(); QWidget :: update();。一切都失败了。

X平台

问题是您的窗体仅存在于此功能范围内。

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

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

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

如果Fr对象不仅应存在于此函数中,还需要在堆而不是堆栈上创建它。PS:有关案例研究,例如有关堆栈vs堆的信息,请参阅:堆栈和堆在什么地方?

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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在QT C ++中的QSystemTrayIcon附近显示QWidget或QWindow

如何在 C++(Eigen 或 Qt)中从 Scipy 重复旋转

如何在Qt Creator中启用C ++ 11?

如何在QT中处理C#COM事件?

如何在Qt QML中退出C ++应用程序

如何在 QT c++ 中制作秒表?

如何在QT c ++的另一个线程中更新progressBar中的值

如何在QToolButton QT C ++中的文本旁边放置箭头图标

如何在Qt C ++应用程序中显示包含大量小部件的可滚动列表?

c++ - 如何在c ++ qt中为不同类中的元素设置所需的布局?

C ++ 11-如何在C ++ 11中制作此Qt语句?

如何在C代码或C ++代码中显示此类文本?

Qt5-如何在Qt C ++应用程序中永久添加sqlite数据库

如何在Qt C ++中向自定义控件添加属性?

如何在Qt C ++中动态创建和加载lib

如何在Qt / C ++中构建自定义的本机OSX Webkit小部件?

如何在QT 5 C ++菜单栏中添加单选按钮

如何在Qt C ++中基于主题更改图标?如果可用,主题为深色或浅色

Qt C ++如何在1个命令中截断属于QStringList成员的QString字母

QT C ++-如何在另一个类中引用窗口小部件

如何在不使用 json 的情况下解析 Qt C++ 中的数据?

如何在不使用qt的情况下知道c ++中的unicode块?

如何在 C++ 中创建一个简单的 GUI;没有 Qt、Gtk 或 Mondo?

如何在 Qt/C++ 中仅将文件路径作为字符串访问文件?

如何在Qt中的图像上显示文本?

如何在C ++中的OpenGL中在矩形上显示文本?

如何在 Qt python 中显示图片

如何在 Qt 中更新场景?

如何在 C# 中的按钮上显示文本?