Qt

Qt问题总汇

信号和槽

连接函数:connect

1
2
connect(信号发送者,发送的信号(函数的地址),信号接受者,处理的槽函数(函数的地址));
connect(Button,&QpushButton::clicked,this,&Qwidget::close);

松散耦合:发送端和接受端的松散耦合

自定义槽函数和信号

  • signal只能声明,不能定义,写在发送信号的类的signals中,返回值是void
  • slot需要声明,需要在cpp文件中定义,写在public slots文件中,返回值是void
1
2
3
4
5
6
7
8
9
10
11
12
class.h
public slots:
// slots function area or declaration in public
//return is void,need declaration ,and realize.
void treat();
};


class.cpp
void Studnet::treat(){
qDebug()<<"treat!";
}
1
2
3
4
signals:
//custom signals
//return is void,only declaration ,Needn't realize
void hungry();

定义槽和信号后,需要定义触发函数

1
2
3
4
5
weidget:
void classover();
void classover(){
emit zt->hungry();
}

要先定义connect再调用classover

信号的重载

信号函数和槽函数直接重载时,会因为二义性而导致程序无法编译,于是我们需要用函数指针来代替直接给地址,方法如下:

1
2
3
4
void(Teacher:: *teachersignal)(QString)=&Teacher::hungry;
void(Studnet:: *studentslot)(QString) = &Studnet::treat;

connect(zt,teachersignal::hungry,st,studentslot);
  • 问题:这里的两个函数指针是如何定义的???
  • 答:

Qstring 转char *

1
Qstring.toUtf8().data()  //先转utf8,再转char*

信号连接信号

1
connect(btn,&QPushButton::clicked,zt,teachersignal2);

直接将两个信号用connect相连

  • 断开信号 disconnect
  • 多个信号一个槽
  • 多个槽连接一个信号

  • 信号和槽的参数类型必须一一对应,信号参数个数可以大于槽函数的参数个数

lambda函数

1
2
3
4
5
6
7
8
9
//connect 一般使用方法
connect(信号发送者,发送的信号(函数的地址),信号接受者,处理的槽函数(函数的地址));

//lambda 使用的方式
connect(btn3,&QPushButton::clicked,this,[=](){
btn3->move(200,100);});
//可以省略this
connect(btn3,&QPushButton::clicked,[=](){
btn3->move(200,100);});
  • 问:为什么lambda的函数不像之前的函数一样,需要取地址符&.
  • 答:可以不加取地址符,但是早期Qt并不支持.

模态与非模态

模态

1
2
3
4
5
connect(ui->actionnew,&QAction::triggered,[=](){
QDialog dlg(this);
dlg.resize(200,100);
dlg.exec(); //对话框窗口保持
qDebug()<<"modal dialog!";

非模态

1
2
3
4
5
[=](){QDialog dig2(this);
dig2.show(); //无法保持,一闪而过
}
QDialog *dig2 =new QDialog(this);
dig2->show(); //可以保持(堆区)
  • 问:指针调用和对象调用为什么会出现不一样的结果?
  • 答: