QT 初学第二章(二)

1.学会用QT的信号和槽

一、一个信号可以连接多个槽

connect(slider,SIGNAL(valueChanged(int)),spinBox,SLOT(setValue(int)));

connect(slider,SIGNAL(valueChanged(int)),this,SLOT(updateStatusBarIndiCator(int)));

发射信号时,会以不确定的方式调用这些槽

二、多个信号可以连接同一个槽

connect(lcd,SIGNAL(overflow())),this,SLOT(handleMathError()));

connect(calculator,SIGNAL(divisionByZero()),this,SLOT(handleMathError()));

三、一个信号可以与另外一个信号连接

connect(LineEdit,SIGNAL(textChanged(const QString&)),this,SIGNAL(updateRecord(const QString &)));

当发射第一个信号时也会发射第二个信号,除此之外,信号与信号之间的连接和信号与槽之间的连接是难以区分的

扫描二维码关注公众号,回复: 2942342 查看本文章

四、连接可以被移除

disconnect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));

不过这种情况较少用到,因为当删除对象时,qt会自动移除和这个对象相关的所有连接

要把信号成功连接到槽(或者连接到另外一个信号),它们的参数必须具有相同的顺序和相同的的类型,这里也有例外,如果信号的参数的比它所连接的槽的参数多,那么多余的参数将会被简单的忽略掉

无论是使用手工编码还是使用QT设计师,在创建对话框时总要包含以下这几个相同的基本步骤:

1、创建并初始化窗口部件。

2、把子窗口部件放到布局中

3、设置Tab键顺序

4、建立信号-槽之间的关系

5、实现对话框中的自定义的槽

使用QT设计设计师的熟悉编辑器可以设置每一个窗口部件的属性

1、单击文本标签。确保此时objectName的属性值为label_1,那么就可以将它的text属性设置为"&Cell Location:"

2、单击行编译器。确保objectName属性是“lineEdit”。

3、单击第一个按钮。将它的objectName属性设置为“okButton”,将它的enabled属性设置成false,将它的text属性设置成"ok",并且将它的default属性设置成true,

4、单击第二个按钮。将它的objectName属性设置为“cancelButton”,将它的enabled属性设置成false,将它的text属性设置成"cancel"。

现在,除了文本标签,所有的窗口部件都很看起来很不错,文本标签仍显示为“@Cell Location:”。单击Edit->Edit Buddies进入一种允许设置窗口部件伙伴的特殊模式。然后,单击这个标签并把红色箭头拖到行编译器上,释放鼠标按键。

1、单击“Cell Location:”标签并且当单击与之相邻的行编辑器时按下Ctrl键,这样就可以同时选择它们。单击from->Lay Out Horizontally

2、单击分隔符,然后单击窗体上的OK按钮和cancel按钮时一直按下Ctrl按键。单击from->Lay Out Horizontally

3、单击窗口中的空白,取消对所有已选中项的选择,然后单击From->Lay Out vertically

4、单击From->Adjust Size,重新把窗体的大小定义为最佳形式。

下面是我写的程序:

//test.h

#ifndef TEST_H
#define TEST_H
#include <QMainWindow>
namespace Ui {
class test;
}
class test : public QMainWindow
{
    Q_OBJECT
public:
    explicit test(QWidget *parent = 0);
    ~test();
private slots:
    void on_lineEdit_textChanged(const QString &arg1);
    void on_okButton_clicked();
    void on_CancelButton_clicked();
private:
    Ui::test *ui;
};
#endif // TEST_H
//test.cpp
#include "test.h"
#include "ui_test.h"
#include <QDebug>
test::test(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test)
{
    ui->setupUi(this);
}
test::~test()
{
    delete ui;
}
void test::on_lineEdit_textChanged(const QString &arg1)
{
ui->okButton->setEnabled(ui->lineEdit->hasAcceptableInput());
}
void test::on_okButton_clicked()
{
qDebug()<<"world"<<endl;
}
void test::on_CancelButton_clicked()
{
qDebug()<<"hello"<<endl;
}
//main.cpp
 
 
#include "test.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test w;
    w.show();
    return a.exec();
}
 
 要使用QDialogButtonBox来制作这个对话框,必须同时修改设计过程和上述代码。在QT设计师,一共需要4步 
 
1.单击窗体(不是任何窗口部件或布局),然后单击Form->Break Layout
2.单击并删除OK按钮、Cancel按钮、水平分隔符以及(现在为空的)水平布局。
3、在窗体上拖放一个按钮盒(Button Box),放在标签和行编辑器单元的下方。
4、单击窗体,然后单击From->Lay Out Vertically.
下面是修改后的文件:
//test.h
 
 
#ifndef TEST_H
#define TEST_H
#include <QMainWindow>
namespace Ui {
class test;
}
class test : public QMainWindow
{
    Q_OBJECT
public:
    explicit test(QWidget *parent = 0);
    ~test();
private slots:
    void on_lineEdit_textChanged(const QString &arg1);
    void accept();
    void reject();
private:
    Ui::test *ui;
};
#endif // TEST_H
//test.cpp
 
 
#include "test.h"
#include "ui_test.h"
#include <QDebug>
#include <QPushButton>
test::test(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test)
{
    ui->setupUi(this);
    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
    connect(ui->buttonBox,SIGNAL(accepted()),this,SLOT(accept()));
    connect(ui->buttonBox,SIGNAL(rejected()),this,SLOT(reject()));
}
test::~test()
{
    delete ui;
}
void test::on_lineEdit_textChanged(const QString &arg1)
{
 ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ui->lineEdit->hasAcceptableInput());
}
void test::accept(){
    qDebug()<<"world"<<endl;
}
void test::reject(){
    qDebug()<<"hello"<<endl;
}
 
 //main.cpp 
 
 
 
#include "test.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test w;
    w.show();
    return a.exec();
}
 
  
 




猜你喜欢

转载自blog.csdn.net/zq4132/article/details/42108477