1.Qstring类
功能:显示一个字符串内容
构造函数:
Qstring(const char* str)
Qstring (const Qstring &Other)
Qstring()
赋值运算符重载:
Qstring operate =(const Qstring &other)
功能函数:
①基本数据类型(int,float,double,char*)转换成字符串
ui‐>testLabel‐>setText(QString::number(20,16));
返回值:得到基本类型数据 "20" ---->20,不能进行"hello" ---> 数字
③Qstring 和C++中的string之间的转换
将string -----> QString
[static] QString QString::fromStdString(const std::string &str) -- 静态成员函数,可以直接使用类名调用
举例说明:
string str =teacher->getName();
Qstring name=Qstring::fromStdString(str);
std::string QString::toStdString() const ----- 普通的成员函数,要使用对象来调用
④arg函数-----用来实现字符串的连接
Qstring Qstring::arg(int aa,int fieldWidth=0,int base=10,QChar fillChar = QLatin1Char(' ')) const -----普通成员函数,要使用对象来调用
功能:当程序运行时,可以实现对一个参数的设置
参数说明:
参数一:int a -----> 要传入的参数的值
举例说明:
//为了实现动态的参数传入,那么使用%来实现提前占位符,比如 %1 %2 ..
//一个%占位符对应一个arg
//QString progress = QString("当前下载进度为:%1 ").arg(50);
QString ss("当前下载进度为:%1");
QString progress= ss.arg(50);
ui‐>downloadLabel‐>setText(progress);//progress‐‐‐> 当前下载进度为:50
2. QMessageBox---- 消息盒子
当程序在运行过程中,希望给用户一些提示的作用,消息盒子它可以实现
QMessageBox msgBox;
msgBox.setText("The document has been modified.");
msgBox.exec();
效果图:
案例:
void TeacherQmainWindow::on_messageBoxButton_clicked()
{
QMessageBox msgBox; //创建一个消息盒子
msgBox.setWindowTitle("输入提示");
msgBox.setText("用户名或密码出错,请重新输入."); //给消息盒子设置一个消息内容
msgBox.exec(); //执行并显示一个消息盒子
}
3.多界面编程
多界面编程:实现界面的跳转
界面跳转又分为无数据跳转和有数据传输跳转
多界面跳转的实现原理:信号与槽
信号和槽的使用形式一:
在ui文件中,右击控件 -----> 选择 转槽 ----- 通常应用在界面上给指定的控件设置动态
第0步:创建一个界面类,在Qt中创建一个界面类:.h .cpp .ui
第一步:创建另一个界面的对象 、
第二步:显示要跳转的界面
//如果账号和密码正确,进行到管理员界面 ‐‐‐‐ 启动管理员界面(多界面编程)
/第一步:创建另一个界面的对象
AdminWindow* admin = new AdminWindow; //不能创建在栈上
//第二步:显示要跳转的界面
admin‐>show();
//第三步:关闭或者隐藏当前的界面
this‐>close();
第一步:右击项目 ---- > new(创建文件),在弹出的对话框中,选择如下设置
第三步:选择下一步,设置界面类的名字
第四步:点击下一步,完成 即可。
3.2 界面跳转携带数据 ---- 信号和槽(signal and slot)
在qt中,因为不同界面,本质上就是不同的类的对象,说到底还是不同类之间的数据传输,
使用信号和槽来实现(Signals and slots are made possible by Qt's meta-objectsystem--qt元对象系统)
4.信号和槽
class Test:public qt类
{
//如果是自定义的类,想要支持信号和槽的操作,必须要加上宏
Q_OBJECT //声明这个宏,来说明要使用信号和槽
//定义信号 ‐‐‐‐ 关键字 signals
signals:
void test(); //信号不带数据
void test1(int data); //信号带数据
private slots:// public slots protected slots
void testfunc(); //槽函数参数类型要跟信号的类型要保持一致,这样才能保证类型安全
//槽函数的 参数个数,不能超过信号参数个数
void test1func(int data);
};
connect(this,&LoginWin::sendUserName ,sw,&SystemMainWindow::getUserData);
[static] QMetaObject::Connection QObject::connect(
const QObject *sender,
const char *signal,
const QObject *receiver,
const char *method,
Qt::ConnectionType type = Qt::AutoConnection//第五个参数,不设置默认为AutoConnection
)
Qt::ConnectionType type = Qt::AutoConnection ‐‐‐ 使用connect函数之后 ,那么信号和槽就已建立连接
emit test1(1); //在发送信号时,指定要传输数据
void LoginWin::test1func(int data)
{
ui‐>testLabel‐>setText(QString::number(data));
}
QT第五个参数详解:
1、Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。
2、Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。
3、Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。
4、Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
5、Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。
参考博客