• 6951阅读
  • 14回复

[提问]新手求助~~,信号和槽的问题。。我把代码贴出来,。 [复制链接]

上一主题 下一主题
离线b05071262
 

只看楼主 倒序阅读 楼主  发表于: 2011-01-26
— 本帖被 XChinux 执行加亮操作(2011-01-28) —
头文件
#ifndef PRINTER_H
#define PRINTER_H
#include <QDialog>
class QDialogButtonBox;
class QPushButton;
class QTabWidget;
   // 1
class widget_printer : public QDialog
{
    Q_OBJECT
public:
    widget_printer(QWidget *parent = 0);
private:
    QTabWidget *tabwidget;    
};
   // 2
class tab_port:public QDialog
{
    Q_OBJECT
public:
    tab_port(QWidget *parent = 0);
private:
    QDialogButtonBox *buttonBox;
};
   // 3
class tab_options:public QDialog
{
    Q_OBJECT
public:
    tab_options(QWidget *parent = 0);
private:
    QPushButton *closebutton;
};
#endif

构造函数
#include <QtGui>
#include "test.h"
widget_printer::widget_printer(QWidget *parent):QDialog(parent)
{
    
    tabwidget = new QTabWidget;
    tabwidget->addTab(new tab_port,tr("&Ports"));
    tabwidget->addTab(new tab_options,tr("&tab_options"));
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(tabwidget);
    setLayout(vbox);
}

tab_port::tab_port(QWidget *parent):QDialog(parent)
{
    buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok
                                 | QDialogButtonBox::Cancel);
    
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(buttonBox);
    setLayout(vbox);
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));

}
tab_options::tab_options(QWidget *parent):QDialog(parent)
{
    closebutton = new QPushButton(tr("Close"));
    QLabel *label = new QLabel(tr("test test test"));
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(label);
    vbox->addWidget(closebutton);
    setLayout(vbox);
    connect(closebutton,SIGNAL(clicked()),this ,SLOT(close()));
}
我想tab_options中点击closebutton按钮,然后关闭整个窗口,而不是仅仅关闭tab_options子窗体,
connect(closebutton,SIGNAL(clicked()),this ,SLOT(close()));这句的this指针要怎么该,才能将信号
传给widget_printer 。。。
离线b05071262

只看该作者 1楼 发表于: 2011-01-26
自己顶下,这个问题应该不难,我C++基础不扎实,。
离线梅克斯
只看该作者 2楼 发表于: 2011-01-26
this改成parent试下
离线b05071262

只看该作者 3楼 发表于: 2011-01-26
回 2楼(梅克斯) 的帖子
parent,是不行的,,我有试过~~!
离线梅克斯
只看该作者 4楼 发表于: 2011-01-26
加个中间信号,clicked之后tab_options发出那个信号,在widget_printer 中接收tab_options发出的那个信号,然后连接到close就行了
离线b05071262

只看该作者 5楼 发表于: 2011-01-26
回 4楼(梅克斯) 的帖子
呵呵  我就是不懂 如何让tab_options的信号传给widget_printer..。。。
离线梅克斯
只看该作者 6楼 发表于: 2011-01-26
在widget_printer的构造函数改成
    
    tabwidget = new QTabWidget;
tab_options* option = new tab_options;
connect(option,SIGNAL(你的信号),this,SLOT(close()));
    tabwidget->addTab(new tab_port,tr("&Ports"));
    tabwidget->addTab(option,tr("&tab_options"));
    QVBoxLayout *vbox = new QVBoxLayout;
    vbox->addWidget(tabwidget);
    setLayout(vbox);
当然tab_options里面别忘了发你的信号

[ 此帖被梅克斯在2011-01-26 16:16重新编辑 ]
只看该作者 7楼 发表于: 2011-01-26
回 3楼(b05071262) 的帖子
改parent是可行的,不过另外要改多一处地方。
把widget_printer构造函数中的
tabwidget->addTab(new tab_options,tr("&tab_options"));

改为

tabwidget->addTab(new tab_options(this),tr("&tab_options"));


总结原因:tabwidget并不像布局类那样自动重置其上的控件的父对象,所以需要以
new tab_options(this)
的方式手动指定tab_options的父对象。
PS:楼上手真快,回帖神速啊。
离线b05071262

只看该作者 8楼 发表于: 2011-01-26
回 6楼(梅克斯) 的帖子

tab_options里面我这样改是错误的没反应
connect(closebutton,SIGNAL(clicked()),this ,SIGNAL(clicked()));

不知道该怎么改

离线b05071262

只看该作者 9楼 发表于: 2011-01-26
回 7楼(我要下载代码) 的帖子
太感谢你了~~!你的方法是可以的。。。。
离线b05071262

只看该作者 10楼 发表于: 2011-01-26
谢谢  “梅克斯”,,热心帮助,不过你说的信号转接,我还是改不出来,,,能教下具体怎么操作不
离线梅克斯
只看该作者 11楼 发表于: 2011-01-26
回 8楼(b05071262) 的帖子
唉,我觉得你应该去看看书.....
离线b05071262

只看该作者 12楼 发表于: 2011-01-26
回 11楼(梅克斯) 的帖子
嗯  ~~!正在看中,,呵呵
离线梅克斯
只看该作者 13楼 发表于: 2011-01-26
回 12楼(b05071262) 的帖子
http://www.qtcn.org/gpq4

《C++ GUI Qt 4编程》(第2版)

这本书不错,初学很有帮助
离线b05071262

只看该作者 14楼 发表于: 2011-01-26
回 13楼(梅克斯) 的帖子
谢谢啦~~!
快速回复
限100 字节
 
上一个 下一个