• 7745阅读
  • 20回复

怎样响应方法? [复制链接]

上一主题 下一主题
离线soundbbg
 

只看楼主 倒序阅读 楼主  发表于: 2008-05-14
— 本帖被 XChinux 执行加亮操作(2008-05-14) —
我在主窗口有一个QTextEdit,和QPushButton,点一下Button就可以在QTextEdit里插入字符串,我做.net和mfc开发..没接触过这个,看到这个平台的可移植性,觉得不错..不知道是怎样响应方法的..

查看了一些代码,并没有发现怎么响应方法..还是我太笨了..所以求教了

class MyWindow:public QDialog, public Ui_Dialog
{
Q_OBJECT
public:
    MyWindow(QWidget *parent = 0);
    ~MyWindow();
    void mousePressEvent(QMouseEvent *e);
};




MyWindow::MyWindow(QWidget *parent): QDialog(parent)
{
    setupUi(this); }

MyWindow::~MyWindow()
{
}

void MyWindow::mousePressEvent(QMouseEvent *e)
{

}

在代码里我怎样触发这个事件呢?求教了
离线zy765

只看该作者 1楼 发表于: 2008-05-14
Qt使用信号和槽响应机制,如同mfx中的消息循环,找connect(....),四个参数。
离线lzian
只看该作者 2楼 发表于: 2008-05-14
按钮的clicked()信号,connect上文本框的setText()槽。
槽slot相当于触发的事件,信号signal相当于触发器
离线soundbbg

只看该作者 3楼 发表于: 2008-05-14
我知道了 但是还有一个问题 connect信号槽 比如 pushbutton,click(),edit,xxx
这个xxx不能为别的函数吗?只能是edit的函数?
离线soundbbg

只看该作者 4楼 发表于: 2008-05-14
好像我在代码里改了也没用 不能响应..
离线lzian
只看该作者 5楼 发表于: 2008-05-14
xxx可以自己定义,不过一定槽函数,有slot:修饰

不妨贴一段代码,看看
离线gery_sunjian
只看该作者 6楼 发表于: 2008-05-14
clicked(), 不是 click()
离线soundbbg

只看该作者 7楼 发表于: 2008-05-14
QObject::connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(selectAll())); 我不想响应这个方法
其实我想实现的地方很简单 就是按下按钮 然后在textedit里插入字符

UI_dialog类

class Ui_Dialog
{
public:
    QTextEdit *textEdit;
    QPushButton *pushButton;

    void setupUi(QDialog *Dialog)
    {
    if (Dialog->objectName().isEmpty())
        Dialog->setObjectName(QString::fromUtf8("Dialog"));
    Dialog->resize(400, 300);
    textEdit = new QTextEdit(Dialog);
    textEdit->setObjectName(QString::fromUtf8("textEdit"));
    textEdit->setGeometry(QRect(20, 10, 361, 171));
    pushButton = new QPushButton(Dialog);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(160, 230, 75, 23));

    retranslateUi(Dialog);
    QObject::connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(selectAll()));

    QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
    Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("Dialog", "ok", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(Dialog);
    } // retranslateUi

};

其他的类 mywindow如我发的贴..
离线gery_sunjian
只看该作者 8楼 发表于: 2008-05-14
ui 里的 QObject::connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(selectAll())); 应该可以 在这个文件里修改去掉吧, 用xml 打开它, 之后进行修改..
离线soundbbg

只看该作者 9楼 发表于: 2008-05-14
我不太明白

class Ui_Dialog
{
public:
    QTextEdit *textEdit;
    QPushButton *pushButton;

    void setupUi(QDialog *Dialog)
    {
    if (Dialog->objectName().isEmpty())
        Dialog->setObjectName(QString::fromUtf8("Dialog"));
    Dialog->resize(400, 300);
    textEdit = new QTextEdit(Dialog);
    textEdit->setObjectName(QString::fromUtf8("textEdit"));
    textEdit->setGeometry(QRect(20, 10, 361, 171));
    pushButton = new QPushButton(Dialog);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(160, 230, 75, 23));

    retranslateUi(Dialog);
    QObject::connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(selectAll()));

    QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
    Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("Dialog", "ok", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(Dialog);
    } // retranslateUi

  void insert()
  {}

};

如果我要执行这个方法

这里 你看,改成这样可以吗?
QObject::connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(insert()));

而且我发现 .ui和.cpp在执行了uic以后并没有再关联了 应该来说xml和.cpp应该没有什么关系了吧
离线gery_sunjian
只看该作者 10楼 发表于: 2008-05-14
用xml 才能修改吧, 直接在这里修改, 还会自动生成出来的.
离线lzian
只看该作者 11楼 发表于: 2008-05-14
你的mywindow定义有错
应该是class mywindow::pulic QDialog, public Ui::Ui_Dialog{}.
一个信号可以连接多个槽,
insert()方法是定义在mywindow里的,用public/private slot:修饰
在mywindow的结构函数里添加connect(pushButton, SIGNAL(clicked()), textEdit, SLOT(insert()));
离线soundbbg

只看该作者 12楼 发表于: 2008-05-14
哦 信号槽应该在mywindow里?
还有那个xml .ui后缀的 好像生成代码后就没什么关系了吧?
离线cdanger
只看该作者 13楼 发表于: 2008-05-14
ui文件通过uic转换成.h文件,Code确实不再用xml的东西了。
slot可以自定义,也可以用预设的,你想要往QLineEdit加字符串,字符串从哪里来?固定的吗?不然的话,你得自定义一个Slot了。

这个东西还是看一下QT手册吧,不然这个机制没搞懂,你怎么做?
离线soundbbg

只看该作者 14楼 发表于: 2008-05-14
我看了QTextEdit方法 好像没有插入字符的方法 我用append
void MyWindow::mousePressEvent(QMouseEvent *e)
{
    textEdit = new QTextEdit();
    textEdit -> setText("123");
}
好像不行
离线lzian
只看该作者 15楼 发表于: 2008-05-14
你这样,鼠标单击一下就会生成一个按钮,但没有显示,因为你没有添加layout
离线soundbbg

只看该作者 16楼 发表于: 2008-05-14
layout? layout是什么控件?
离线lzian
只看该作者 17楼 发表于: 2008-05-14
你还是好好看看Qt的书吧
离线soundbbg

只看该作者 18楼 发表于: 2008-05-14
哦 我知道 只是没看见 不过我的button按下 可以响应 close() 等方法 就是不能响应其他方法 不知道为什么..
离线lzian
只看该作者 19楼 发表于: 2008-05-15
不是所有的方法都能响应,一定要是slot才可以
离线diyuanbo

只看该作者 20楼 发表于: 2008-05-15
我觉得你不必在MyWindow中重新实现mousePressEvent(QMouseEvent *e)。Button被点击后会自动发射一个叫clicked的信号(QPushButton的文档写的很清楚)。你需要将这个Button的这个信号连接到合适的槽上。这个槽可以在MyWindow中实现,并在MyWindow的构造时将Button的那个信号和这个槽连接起来。
快速回复
限100 字节
 
上一个 下一个