Qt从另一个类修改MainWindow

时间:2017-07-13 01:13:30

标签: c++ qt class user-interface pointers

我想从另一个文件中对主窗口进行一些修改。

  • 我创建了另一个ui文件 Form1Window (当按钮在MainWindow中被按下时打开)。
  • 我想从类Form1Window调用MainWindow类的名为test()的函数

我成功调用了函数test(),但我无法执行函数的全部内容(我可以显示一条消息但不能执行我想要的部分清除编辑文本)

MainWindow.h

 #include "form1window.h"

        public slots:
            void nettoyer();

        private slots:
            void openFrom1();

        private:
            Ui::MainWindow *ui;
            From1Window *uiFrom1;

};

MainWindow.cpp

void MainWindow::openFrom1()
{
    uiFrom1 = new From1Window(this);
    uiFrom1->show();
}


void MainWindow::nettoyer(){

     QMessageBox msgBox;
     msgBox.setText("test");
     msgBox.setIcon(QMessageBox::Information);
     msgBox.setStandardButtons(QMessageBox::Ok);
     msgBox.exec();

     ui->auteur->clear();  
          //THIS LINE HAS NO EFFECT WHEN CALLED FROM THE OTHER CLASS
    }

form1window.cpp

#include "mainwindow.h"
#include "ui_form1window.h"

void From1Window::on_supprimer_clicked()
{

MainWindow *a=new MainWindow ();
a->test();

close();
}

我已经了解了MainWindow类(C++ /Qt Proper way to access ui from another class in qt //Edited)指针的作用,我也尝试过connect()

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

  

//这条线从其他类别开始没有效果

     

这 - > UI-> auteur->清除();

除非您解雇QMessageBox,否则该行将永远不会执行。这是因为您使用exec()函数触发了QMessageBox。此函数具有自己的事件队列,并且在完成之前不会返回。您可以将QMessageBox设置为模态并使用show()方法显示它。在这种情况下,QMessageBox不会阻止流的执行。

如果使用exec()显示QDialog,也会发生此问题。

我为您提供了一个简单的双窗口信号/插槽示例:

的main.cpp

#include "mainwindow.h"
#include "form.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Form f;
    f.show();

    return a.exec();
}

form.h

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QPushButton>

class Form : public QWidget
{
    Q_OBJECT

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

private:
    QPushButton *pb;

};

#endif // FORM_H

form.cpp

#include "form.h"
#include "mainwindow.h"

#include <QDebug>

Form::Form(QWidget *parent) : QWidget(parent)
{
    MainWindow *mw = new MainWindow();
    pb = new QPushButton("clickME", this);

    QObject::connect(pb, SIGNAL(clicked()), mw, SLOT(test()));

    mw->show();
}

Form::~Form()
{
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void test();

private:
    QLabel *l;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    l = new QLabel("test", this);
}

MainWindow::~MainWindow()
{
}

void MainWindow::test() {
    qDebug() << "test called!" << endl;
    l->setText("text changed");
}

这适合我。

output