2.图形界面、对话框、信号与槽

一、QT图形界面

  • QT坐标轴:
    X:横轴
    Y:纵轴


    2.图形界面、对话框、信号与槽_第1张图片
    image.png
  • QWidget、QDialog、QMainWindow的区别
    QWidget:窗口为空,什么内容都没有
    QMainWindow:含有menu bar,status bar,tools bar等
    QDialog:对话框

  • 设置编码方式linux除外

    2.图形界面、对话框、信号与槽_第2张图片
    编码.png

  • QMainWinodw

菜单栏--Menu Bar
工具栏--ToolBars
浮动部件--Duck Widgets
主窗口--Central Widget
状态栏--Status Bar

2.图形界面、对话框、信号与槽_第3张图片
布局
2.图形界面、对话框、信号与槽_第4张图片
image.png

注意:窗口设计的代码需要放在构造函数中ui->setupUi(this);代码后面,不然会挂掉。

2.图形界面、对话框、信号与槽_第5张图片
TODO.png

2.图形界面、对话框、信号与槽_第6张图片
Not TODO.png

二、对话框

  • 分类:模态对话框,非模态对话框,半模态对话框
 //Moldal Dialog
    QDialog * Qdlg=new QDialog(&w);//w:parent window
    Qdlg->resize(200,300);
    Qdlg->setWindowTitle(QStringLiteral("Modal Dialog"));
    Qdlg->exec();
 //Modeless Dialog
    QDialog * Qdlg=new QDialog(&w);//w:parent window
    Qdlg->resize(200,300);
    Qdlg->setWindowTitle(QStringLiteral("Modeless Dialog"));
    Qdlg->show();
 //setModal(true/false)实现模态和非模态的转化
    Qdlg->setModal(false);
    Qdlg->show();

三、信号与槽

概念:在Qt中使用信号和槽机制来完成对象之间的协同操作(信号和槽都是函数)

信号:当某个信号对其客户或所有者发生的内部状态发生改动,信号被一个对象发射。只有定义过这个信号的类及其派生类能够发射这个信号。

当一个信号被发射时,和其相关联的槽将被即时执行,就象一个正常的函数调用相同。信号-槽机制完全独立于所有GUI事件循环。只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽和某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,不过他们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行

:槽是普通的C++成员函数,能被正常调用,他们唯一的特别性就是非常多信号能和其相关联。当和其关联的信号被发射时,这个槽就会被调用。槽能有参数,但槽的参数不能有缺省值。

public slots:在这个区内声明的槽意味着所有对象都可将信号和之相连接。这对于组件编程非常有用,你能创建彼此互不了解的对象,将他们的信号和槽进行连接以便信息能够正确的传递。
protected slots:在这个区内声明的槽意味着当前类及其子类能将信号和之相连接。这适用于那些槽,他们是类实现的一部分,不过其界面接口却面向外部。
private slots:在这个区内声明的槽意味着只有类自己能将信号和之相连接。这适用于联系非常紧密的类。
槽也能够声明为虚函数,这也是非常有用的。

关联:通过调用QObject对象的connect函数来将某个对象的信号和另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用

*函数定义:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static]

1.自动关联

2.图形界面、对话框、信号与槽_第7张图片
image.png
  • 按需要选择要生成的槽函数:


    2.图形界面、对话框、信号与槽_第8张图片
    image.png
  • 系统自动生成槽函数,一般以on为开头
//此次自动生成的槽函数
private slots:
    void on_pushButton_clicked();//Qt-defined slot
//槽函数用户自己实现函数体
void MainWindow::on_pushButton_clicked(){}

2.利用connect()关联

注意:信号函数与槽函数的参数必须一致,且都是自定义函数。
信号函数:只需要定义,不需要实现,没有实体。
槽函数:响应函数,需要实现功能。

//parameter : sender signal receiver slot
connect()
  • 系统信号和用户定义槽
//ui头文件里
signals:
    void pushButton2Signal();//user-defined signal
private slots:
    void pushButton2Slot(bool checked);//usr-defined slot

//在ui构造函数中实现connect关联
//parameter : sender signal receiver slot
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(pushButton2Slot(bool)));
  • 用户信号和槽
//ui头文件
signals:
    void pushButton2Signal();//user-defined signal
private slots:
    void pushButtonMySlot();//user-defined slot

//在某函数体内发射信号
emit pushButton2Signal();//emit user-defined signal

////在ui构造函数中实现connect关联
connect(this,SIGNAL(pushButton2Signal()),this,SLOT(pushButtonMySlot()));

3.断开关联

当信号和槽没有必要继续保持关联时,我们能使用disconnect函数来断开连接
函数定义:bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) [static]

有三种情况必须使用disconnect()函数:
(1):断开和某个对象相关联的所有对象。这似乎有点不可理解,事实上,当我们在某个对象中定义了一个或多个信号,这些信号和另外若干个对象中的槽相关联,如果我们要切断这些关联的话,就能利用这个方法,非常之简洁。
disconnect( myObject, 0, 0, 0 ) 或 myObject->disconnect()
(2):断开和某个特定信号的所有关联。
disconnect( myObject, SIGNAL(mySignal()), 0, 0 ) 或 myObject->disconnect( SIGNAL(mySignal()) )
(3):断开两个对象之间的关联。
disconnect( myObject, 0, myReceiver, 0 ) 或 myObject->disconnect( myReceiver )

在disconnect函数中0能用作一个通配符,分别表示所有信号、所有接收对象、接收对象中的所有槽函数。不过发射者sender不能为0,其他三个参数的值能等于0

你可能感兴趣的:(2.图形界面、对话框、信号与槽)