• 8390阅读
  • 4回复

如何通过emit来操作主对话框的控件? [复制链接]

上一主题 下一主题
离线huyaowu
 

只看楼主 倒序阅读 楼主  发表于: 2010-07-19
对话框,show()了一个子对话框,子对话框得到字符串,我想通过emit方式操作主对话框上的lineEdit控件让其显示得到的字符串。
不同类之间如何emit啊?
初学Qt,signal和slot不是很理解, 以下方法行不通..

子对话框test.h:
signals:
    void add(QString x);
public slots:
    void send(void);

test.cpp
test::test(QWidget *parent)
 : QDialog(parent)
{
 ui.setupUi(this);
 QRect rect = pMainDlg->frameGeometry();
 this->move(rect.x()+rect.width(), rect.y());
 connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(send(void)));
 connect(this, SIGNAL(add(QString x)), pMainDlg, SLOT(pMainDlg->onadd(QString x)));
}
void test::send(void)
{
 emit add("hello");
}

主对话框Qttest.h
public slots:
     void onadd(QString x);

Qttest.cpp
void Qttest::onadd(QString x)
{
 QMessageBox::about(this, "OK", x);
}
离线huyaowu

只看该作者 1楼 发表于: 2010-07-20
UP一下
离线dbzhang800

只看该作者 2楼 发表于: 2010-07-20
引用楼主huyaowu于2010-07-19 22:55发表的 如何通过emit来操作主对话框的控件? :
主对话框,show()了一个子对话框,子对话框得到字符串,我想通过emit方式操作主对话框上的lineEdit控件让其显示得到的字符串。
不同类之间如何emit啊?
初学Qt,signal和slot不是很理解, 以下方法行不通..


不同类之间才需要 emit 啊,signal 和 slot 就是对象通讯用的

就像你这个例子,根本不需要 emit,直接去调用 pMainDlg->onadd 不就行了。

connect(this, SIGNAL(add(QString x)), pMainDlg, SLOT(pMainDlg->onadd(QString x)));

这是错的。去掉红色部分
离线huyaowu

只看该作者 3楼 发表于: 2010-07-20
回 2楼(dbzhang800) 的帖子
谢谢!不过我想知道emit怎么用,才能实现pMainDlg->onadd 的效果呢?
红色部分去掉好像也不起作用,不会弹出MessageBox。
离线l_xin
只看该作者 4楼 发表于: 2010-07-21
pMainDlg是什么?你在子对话框里有实例化了主对话框么=,= 结构有点混乱啊。楼主你的两个对话框是分别独立的么?如果子对话框是在主对话框内实例化的,那就按照dbzhang800的方法,直接调用,不用emit。

如果你要知道signal slot怎么用,建议楼主建一个类Controller用来控制各个对话框之间的联系,这个习惯在你以后的项目中窗口多了会比较容易操作。每个对话框的类里只负责接收数据、显示数据等处理,通过emit signal来发送。Controller可以connect不同对话框直接的signal和slot 实现。

你这个例子如果只是为了Test,可以建一个控制类X,窗口A、B、C。main里面实例化X,X里面实例化窗口ABC,hide()不需要显示的窗口,show()主窗口A。A可以emit signal带上数据,X里面可以用connect(a, SIGNAL(), b, SLOT()); 这样很容易实现窗口之间通讯。也可以通过A里面emit signal,X创建slot  void ShowB(){ a.hide(); b.show() },用connect(a, SIGNAL(), this, SLOT(ShowB())); 同样很在X内写各个窗口之间的逻辑关系。

以上是我个人习惯,其实我也是个新手,正在摸索Qt中,这些习惯是从C#和JAVA的MVC结构中带过来的。
快速回复
限100 字节
 
上一个 下一个