【问题标题】:findChild never displays textBrowserfindChild 从不显示 textBrowser
【发布时间】:2017-06-11 13:23:23
【问题描述】:

我试图通过 FindChild 向文本浏览器显示一些文本,但它从未在文本浏览器中显示它,任何帮助都会有所帮助..

这是我的 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

    namespace Ui
    {
        class MainWindow;
        class TestWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        static MainWindow* GetInstance(QWidget* parent = 0);
signals:

public slots:
    void on_pushButton_3_clicked();
    void MainWindow_TextBrowser_String(const QString & newText);

private:
        Ui::MainWindow *ui;
        static MainWindow* mainInstance;

    };

这是我的 mainwindow.cpp

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

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

    void MainWindow::on_pushButton_3_clicked()
    {
        TestWindow mwindow;
        mwindow.start();
    }

    MainWindow* MainWindow::mainInstance = 0;

    MainWindow* MainWindow::GetInstance(QWidget *parent)
    {
        if (mainInstance == NULL)
        {
            mainInstance = new MainWindow(parent);
        }
        return mainInstance;
    }
void MainWindow::MainWindow_TextBrowser_String(const QString & newText)
{
    QString TextBrowser_String = QString(newText);
    ui->textBrowser->append(TextBrowser_String);

}

我在按钮中创建testwindow对象发送start函数调用findchild窗口发送一个字符串到textbrowser窗口

这是我的 testwindow.cpp

void testwindow::start()
{
        // Create a new mainwindow on the heap.
        MainWindow* instance = MainWindow::GetInstance();
        // Or I can call
        // MainWindow instance; then point to findchild
        QString Test_Window_String = QStringLiteral("Test Window String");
        instance->findChild<QTextBrowser*>("textBrowser")->append(Test_Window_String);
}

我知道您可以使用信号和插槽,只需创建一个将字符串发送到附加文本浏览器的信号

void testwindow::singalandslot()
    {
           MainWindow* instance = MainWindow::GetInstance();
           connect(this, SIGNAL(TextBrowswer_String(const QString &)), instance , SLOT(MainWindow_TextBrowser_String(QString &)));
}
void testwindow::fireSignal()
{
    emit TextBrowswer_String("sender is sending to receiver.");
}

即使有信号或 FindChild 似乎对象已经被删除或者我做错了什么。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您能否分享您的 Ui::MainWindow 类和 setupUi 实现以获得清晰的视图?

    希望您已经在 setupUi 或构造函数中为 QTextBrowser* 创建了实例。

    通过以下 setupUi 实现,您的两个用例都可以正常工作。

    namespace Ui
    {
    class MainWindow: public QWidget
    {
      Q_OBJECT
    public:
      QTextBrowser* textBrowser;
      void setupUi(QWidget* parent)
      {
        setParent(parent);
        textBrowser = new QTextBrowser(parent);
        textBrowser->setObjectName("textBrowser");
        textBrowser->setText("Hello");
      }
    };
    }
    

    【讨论】:

    • 您在主窗口中创建它,我不希望它这样做。正如您在源代码中看到的那样。我通过 findchild 或信号将数据从一个类发送到主类..
    • 你有 2 个 MainWindow 类对吗???一个 Ui::MainWindow 和 ::MainWindow。我已经在 Ui::MainWindow 中提供了实现(即)无论你在哪里保存 QTextBrowser* 实例,n 将 ::MainWindow 作为父级分配给 textBrowser。
    • Ui::mainwindow 是通过读取 UI 文件 'mainwindow.ui' 生成的,所以它只是正常的
    • 有人帮忙吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多