将数据发送到另一个表单上的小部件

Send data to widget on another form

本文关键字:小部 表单 另一个 数据      更新时间:2023-10-16

这个主题与此相关:

Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新表单

所以我创建了一些新对象:

class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
   DialogPreviewHeader PreviewHeader;
   Ui_DialogPreviewHeader UIDialog;

然后像这样使用它们:

void MainWindow::on_pushButtonPreviewHeader_clicked()
{
   QString SendTxt = ui->lineEditClassName->text();
   UIDialog.textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   PreviewHeader.show();
}

以前,显示表单有效,现在它似乎随着使用UIDialog而崩溃。textBrowserPreviewHeaderFile指针是在 Ui_DialogPreviewHeader 类中设置的,调试时不为 null。

另一个问题是学习如何将mainWidget和表单与插槽连接起来。

编辑:

当我这样做时:

void MainWindow::on_pushButtonPreviewHeader_clicked()
{
   QString SendTxt = ui->lineEditClassName->text();

   //UIDialog.textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   PreviewHeader.ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   //PreviewHeader->ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   //pushButtonPreviewHeader(SendTxt);
   PreviewHeader->show();

}

各种组合无法编译:

-> - PreviewHeader不是指针.ui - 'Ui::D ialogPreviewHeader* DialogPreviewHeader::ui' 是私有

的将 PreviewHeader

作为指针并使用 -> 窗体也表示 DialogPreviewHeader::ui' 是私有的。

我也尝试实现一个插槽,但反过来绕过主窗口到DialogPreviewHeader:

DialogPreviewHeader::DialogPreviewHeader(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::DialogPreviewHeader)
{
   ui->setupUi(this);
   connect(
       &MainWindow,
       SIGNAL(pushButtonPreviewHeader(QString)),
       this,
       SLOT(ReceiveDataFromMainWidget(QString)));
}

但它不喜欢&MainWindow.

无论如何 - 如果我发布所有代码会好得多。我应该摆脱这个编辑并在这里发布它,还是做另一个问题?

好的 - 这是所有代码 - 将来我会在开始时这样做!

#ifndef DIALOGPREVIEWHEADER_H
#define DIALOGPREVIEWHEADER_H
#include <QDialog>
namespace Ui {
class DialogPreviewHeader;
}
class DialogPreviewHeader : public QDialog
{
   Q_OBJECT
public:
   explicit DialogPreviewHeader(QWidget *parent = 0);
   ~DialogPreviewHeader();

private slots:
   void on_buttonBox_accepted();
   void ReceiveDataFromMainWidget(QString);
private:
   Ui::DialogPreviewHeader *ui;
};
#endif // DIALOGPREVIEWHEADER_H

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "DialogPreviewHeader.h"
#include "ui_DialogPreviewHeader.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
  //DialogPreviewHeader PreviewHeader;
  //Ui_DialogPreviewHeader UIDialog;
private slots:
   void on_pushButtonPreviewHeader_clicked();
   void pushButtonPreviewHeader(QString);
   void on_pushButtonPreviewImplFile_clicked();
   void on_pushButtonWriteFiles_clicked();
   void on_lineEditNSNames_textChanged(const QString &arg1);
   void on_radioButtonNSIndividual_clicked();
   void on_radioButtonOneNSAlias_clicked();
   void on_lineEditClassName_textChanged(const QString &Text);

   void on_lineEditClassNamePrepend_textEdited(const QString &arg1);
   void on_pushButtonCancel_clicked();
   void on_checkBoxPrependCharClassName_clicked();
   private:
       Ui::MainWindow *ui;
       DialogPreviewHeader *PreviewHeader;
       //Ui_DialogPreviewHeader.textBrowserPreviewHeaderFile *pHeader;
       //textBrowserPreviewHeaderFile *pHeader;
   };
   #endif // MAINWINDOW_H

DialogPreviewHeader.h

#include "DialogPreviewHeader.h"
#include "ui_DialogPreviewHeader.h"
#include "MainWindow.h"
#include "ui_MainWindow.h"
DialogPreviewHeader::DialogPreviewHeader(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::DialogPreviewHeader)
{
   ui->setupUi(this);
   connect(
       Ui::MainWindow,
       SIGNAL(pushButtonPreviewHeader(QString)),
       this,
       SLOT(ReceiveDataFromMainWidget(QString)));
}
DialogPreviewHeader::~DialogPreviewHeader()
{
   delete ui;
}

void DialogPreviewHeader::on_buttonBox_accepted()
{
    this->hide();
}

主.cpp

#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   w.show();
   return a.exec();
}

主窗口.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
}
MainWindow::~MainWindow()
{
   delete ui;
}
void MainWindow::on_pushButtonPreviewHeader_clicked()
{
   QString SendTxt = ui->lineEditClassName->text();

   //UIDialog.textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   //PreviewHeader.ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   //PreviewHeader->ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);
   pushButtonPreviewHeader(SendTxt);
   PreviewHeader->show();
}
void MainWindow::pushButtonPreviewHeader(QString) {
}
void MainWindow::on_pushButtonPreviewImplFile_clicked()
{
}
void MainWindow::on_pushButtonWriteFiles_clicked()
{
}
void MainWindow::on_lineEditNSNames_textChanged(const QString &arg1)
{
}
void MainWindow::on_radioButtonNSIndividual_clicked()
{
}
void MainWindow::on_radioButtonOneNSAlias_clicked()
{
}
void MainWindow::on_lineEditClassName_textChanged(const QString &Text)
{
}
void MainWindow::on_lineEditClassNamePrepend_textEdited(const QString &arg1)
{
}
void MainWindow::on_pushButtonCancel_clicked()
   {
  this->close();
   }
void MainWindow::on_checkBoxPrependCharClassName_clicked()
   {
   }

您需要表单还是ui_标题?

编译器输出:

04:48:04: Running steps for project ClassWiz...
04:48:04: Configuration unchanged, skipping qmake step.
04:48:04: Starting: "/usr/bin/make" 
g++ -c -pipe -std=c++11 -Wall -Wextra -pedantic -g -Wall -W -D_REENTRANT -fPIE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/opt/Qt5.1.1/5.1.1/gcc_64/mkspecs/linux-g++ -I../ClassWiz -I/opt/Qt5.1.1/5.1.1/gcc_64/include -I/opt/Qt5.1.1/5.1.1/gcc_64/include/QtWidgets -I/opt/Qt5.1.1/5.1.1/gcc_64/include/QtGui -I/opt/Qt5.1.1/5.1.1/gcc_64/include/QtCore -I. -I. -I. -o DialogPreviewHeader.o ../ClassWiz/DialogPreviewHeader.cpp
../ClassWiz/DialogPreviewHeader.cpp: In constructor 'DialogPreviewHeader::DialogPreviewHeader(QWidget*)':
../ClassWiz/DialogPreviewHeader.cpp:12:26: error: expected primary-expression before ',' token
make: *** [DialogPreviewHeader.o] Error 1
04:48:05: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project ClassWiz (kit: Desktop Qt 5.1.1 GCC 64bit)
When executing step 'Make'
04:48:05: Elapsed time: 00:01.

以下行不正确:

 Ui_DialogPreviewHeader UIDialog;

你不被允许这样做。这一行就足够了:

DialogPreviewHeader PreviewHeader;

而不是:

UIDialog.textBrowserPreviewHeaderFile->setPlainText(SendTxt);

使用这个:

 PreviewHeader->ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);

就您的第二个问题而言,如果您想将数据从小部件(mynewwidget)发送到主窗口,请尝试以下操作:

在小部件(头文件)中创建信号,例如:

信号: void myData(QString);

现在假设

你想将字符串数据从widget(mynewwidget)发送到主窗口,现在只需像一个简单的函数一样调用myData,从那里发送mynewwidget类中的数据,例如你想发送"hello":

myData("Hello");
现在,在 MainWindow 类的

构造函数中,您需要将信号 myData(QString) 与 MainWindow 的任何插槽连接,其签名与 widget 类的信号签名相同。在主窗口的构造函数中,您需要添加以下行进行连接:

connect(&mynewwidget,SIGNAL(myData(QString)),this,SLOT(myRData(QString)));

其中 myRData 是 MainWindow 中的一个插槽。插槽只是可以直接调用以及使用信号的函数。在主窗口类中,插槽将是这样的:

Slots:
 myRData(QString);

现在,每当调用myData时,MyRData也会被调用。请注意,信号没有函数体,您只能通过它们传递数据。

编辑:示例

#ifndef DIALOGPREVIEWHEADER_H
#define DIALOGPREVIEWHEADER_H
#include <QDialog>
namespace Ui {
class DialogPreviewHeader;
}
class DialogPreviewHeader : public QDialog
{
   Q_OBJECT
public:
   explicit DialogPreviewHeader(QWidget *parent = 0);
   ~DialogPreviewHeader();

private slots:
   void on_buttonBox_accepted();
   //void ReceiveDataFromMainWidget(QString);                // not needed
public:                              // made public
   Ui::DialogPreviewHeader *ui;
};
#endif // DIALOGPREVIEWHEADER_H

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "DialogPreviewHeader.h"
#include "ui_DialogPreviewHeader.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
  DialogPreviewHeader PreviewHeader;
private slots:
   void on_pushButtonPreviewHeader_clicked();
   void pushButtonPreviewHeader(QString);
   void on_pushButtonPreviewImplFile_clicked();
   void on_pushButtonWriteFiles_clicked();
   void on_lineEditNSNames_textChanged(const QString &arg1);
   void on_radioButtonNSIndividual_clicked();
   void on_radioButtonOneNSAlias_clicked();
   void on_lineEditClassName_textChanged(const QString &Text);

   void on_lineEditClassNamePrepend_textEdited(const QString &arg1);
   void on_pushButtonCancel_clicked();
   void on_checkBoxPrependCharClassName_clicked();
   private:
       Ui::MainWindow *ui;
       //DialogPreviewHeader *PreviewHeader;                         not needed
       //Ui_DialogPreviewHeader.textBrowserPreviewHeaderFile *pHeader;
       //textBrowserPreviewHeaderFile *pHeader;
   };
   #endif // MAINWINDOW_H

DialogPreviewHeader.h

#include "DialogPreviewHeader.h"
#include "ui_DialogPreviewHeader.h"

#include "MainWindow.h"//永远不要再这样做了 #include "ui_MainWindow.h"//这也是

DialogPreviewHeader::DialogPreviewHeader(QWidget *parent) :
   QDialog(parent),
   ui(new Ui::DialogPreviewHeader)
{
   ui->setupUi(this);
   /*connect(                                     // never do this again
       Ui::MainWindow,
       SIGNAL(pushButtonPreviewHeader(QString)),
       this,
       SLOT(ReceiveDataFromMainWidget(QString)));*/
}
DialogPreviewHeader::~DialogPreviewHeader()
{
   delete ui;
}

void DialogPreviewHeader::on_buttonBox_accepted()
{
    this->hide();
}

主.cpp

#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   w.show();
   return a.exec();
}

主窗口.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
}
MainWindow::~MainWindow()
{
   delete ui;
}
void MainWindow::on_pushButtonPreviewHeader_clicked()
{
   QString SendTxt = ui->lineEditClassName->text();

//Make sure  Ui::DialogPreviewHeader *ui; is public in dialogpreviewheader.h

PreviewHeader.ui->textBrowserPreviewHeaderFile->setPlainText(SendTxt);

   pushButtonPreviewHeader(SendTxt);
   PreviewHeader->show();
}
void MainWindow::pushButtonPreviewHeader(QString) {
}
void MainWindow::on_pushButtonPreviewImplFile_clicked()
{
}
void MainWindow::on_pushButtonWriteFiles_clicked()
{
}
void MainWindow::on_lineEditNSNames_textChanged(const QString &arg1)
{
}
void MainWindow::on_radioButtonNSIndividual_clicked()
{
}
void MainWindow::on_radioButtonOneNSAlias_clicked()
{
}
void MainWindow::on_lineEditClassName_textChanged(const QString &Text)
{
}
void MainWindow::on_lineEditClassNamePrepend_textEdited(const QString &arg1)
{
}
void MainWindow::on_pushButtonCancel_clicked()
   {
  this->close();
   }
void MainWindow::on_checkBoxPrependCharClassName_clicked()
   {
   }