• 4432阅读
  • 9回复

[提问]新建类,向窗体中的控件传递数据? [复制链接]

上一主题 下一主题
离线vbroot
 

只看楼主 倒序阅读 楼主  发表于: 2014-08-19
新建类中有一个全局函数(非成员函数),如何向窗体控件传递数据
有人能帮忙吗?
离线foxgod

只看该作者 1楼 发表于: 2014-08-19
啥意思,给lineedit传数据,那你给他设置值就好了吗??
离线vbroot

只看该作者 2楼 发表于: 2014-08-22
新建类中有一个全局函数(非成员函数),如何向窗体控件传递数据?
有人能帮忙吗?

代码大概是这样的,只是其实add函数在另一个类中定义的。

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent) :
  4.     QWidget(parent),
  5.     ui(new Ui::Widget)
  6. {
  7.     ui->setupUi(this);
  8. }
  9. Widget::~Widget()
  10. {
  11.     delete ui;
  12. }
  13. int add(int x,int y)
  14. {
  15.     //ui->lineEdit->setText("str"); 如何实现在这里对控件赋值?
  16.     return x+y;
  17. }
  18. void Widget::on_pushButton_clicked()
  19. {
  20.    QString str=QString::number(add(1,2));
  21.    ui->lineEdit->setText(str);
  22. }

离线chinkyy

只看该作者 3楼 发表于: 2014-08-22
我觉得你可以这样做
1.把ui的修饰符改成public,使得add函数中可以访问到ui(不推荐)

2. 使用信号和槽机制,定义一个信号然后在add函数中emit
离线vbroot

只看该作者 4楼 发表于: 2014-08-22
int add(int x,int y)
{
    //ui->lineEdit->setText("str"); 如何实现在这里对控件赋值
    emit settext(5);
    return x+y;
}

貌似error: C3861: “settext”: 找不到标识符
离线彩阳

只看该作者 5楼 发表于: 2014-08-22
全局变量好办。
一个地方定义之,另外一个地方用
extern修饰之,照样可以使用。
上海Qt开发联盟,热忱地欢迎你的加入!
离线chinkyy

只看该作者 6楼 发表于: 2014-08-22
回 vbroot 的帖子
vbroot:int add(int x,int y)
{
    //ui->lineEdit->setText("str"); 如何实现在这里对控件赋值
    emit settext(5);
    return x+y;
....... (2014-08-22 11:52) 

先定义一个信号,如
signals:
   void textChanged(QString str);

然后在构造函数中把这个信号连接到lineEdit的槽上,如
connect(this, SIGNAL(textChanged(QString),ui->lineEdit, SLOT(setText(QString)));

最后在你的add函数中发射这个信号,如
emit("hello!");
离线chinkyy

只看该作者 7楼 发表于: 2014-08-22
回 chinkyy 的帖子
chinkyy:先定义一个信号,如
signals:
   void textChanged(QString str);
....... (2014-08-22 13:02) 

不好意思,我仔细看了一下,误导大家了,抱歉、抱歉哈,更正一下了,单独的一个全局add()函数,你如果没有给它传Widget对象,这个事情还真不好办,有这种需求挺纳闷的,如果有传对象的话可以在Widget这个类中写一个QWidget * getLineEdit();这样一个方法,得到lineEdit对象的指针然后再操纵它应该是可以的....
离线vbroot

只看该作者 8楼 发表于: 2014-08-22
看样子不能发emit了。
暂时只能传指针了,不知道还有没有其它办法,共享内存估计也可以就是太麻烦。
sendmessage  WM_COPYDATA 估计也行,就是感觉太麻烦了
离线vbroot

只看该作者 9楼 发表于: 2014-08-22
解决了,这样就能在全局函数里发信号了。


  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget *dlg=0;
  4. Widget::Widget(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::Widget)
  7. {
  8.     ui->setupUi(this);
  9.     connect(this,SIGNAL(settext(int)),this,SLOT(test(int)));
  10.     dlg=this;
  11. }
  12. Widget::~Widget()
  13. {
  14.     delete ui;
  15. }
  16. int add(int x,int y)
  17. {
  18.     //ui->lineEdit->setText("str"); 如何实现在这里对控件赋值
  19.     //emit settext(4);
  20.     emit dlg->settext(4);
  21.     return x+y;
  22. }
  23. void Widget::on_pushButton_clicked()
  24. {
  25.    QString str=QString::number(add(1,2));
  26.    //ui->lineEdit->setText(str);
  27. }
  28. void Widget::test(int n)
  29. {
  30.     QString str=QString::number(n);
  31.     ui->lineEdit->setText(str);
  32. }

快速回复
限100 字节
 
上一个 下一个