簡體   English   中英

qt c++中如何更新QWindow,文字不顯示

[英]How to update QWindow in qt c++, text doesn't show

我正在編寫 QT 桌面應用程序,但遇到一個小問題。 我想用我從文件中輸入的文本打開新標簽。

我有兩個 class,一個在 mainwindow.h 中,第二個在 form.h 中

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

表格.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

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

表格.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() 之后,QWidget 中的純文本仍然是空的我試過:this->update, this->repaint, Form::update(); 表單::重繪(), QWidget::重繪(); QWidget::更新();。 一切都失敗了。

問題是你的Form只存在於這個function scope中。

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

這里 -> Form Fr; 創建表單:調用 class 表單的構造函數( explicit Form(QWidget *parent = nullptr);

在這個地方 -> }你的表格被刪除:調用 class 表格的析構函數( ~Form(); )。 發生這種情況是因為您在 function 堆棧上創建了 Form 實例。 所以Fr是本地的object,只存在於function on_actionShow_text_file_triggered()的scope中,在function執行/完成后,所有局部變量都被釋放/銷毀。

如果你的Fr object 不應該只存在於這個 function 中,你需要在堆上而不是堆棧上創建它。 PS:對於案例研究,例如閱讀有關堆棧與堆的內容:堆棧和堆是什么以及在哪里?

您的on_actionShow_text_file_triggered function 應該如下所示:

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
}

這個Form * Fr = new Form(this); 每次都會創建新的表單指針。 創建一個指向表單的全局指針,調用函數然后刪除它不是更好嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM