QT学习日记三--QT的基本控件、信号与槽

1.Qstring类

        功能:显示一个字符串内容

        构造函数:

                Qstring(const char* str)

                Qstring (const Qstring &Other)

                Qstring()

        赋值运算符重载:

                Qstring operate =(const Qstring &other)

        功能函数:

        ①基本数据类型(int,float,double,char*)转换成字符串

        number (int , int ) : QString
        number (uint , int ) : QString
        number (ulong , int ) : QString
        number (qlonglong , int ) : QString
        number (qulonglong , int ) : QString
        number (double , char , int ) : QString
         number (long , int ) : QString
        
        举例说明:
                 QString QString::number(int n , int base = 10)
                参数:
                        
                        参数一:int n ---- 要转换的数据
                        参数二:int base = 10 ---- 设置数据的进制,默认为十进制,2 8 16
                        返回值:QString
ui‐>testLabel‐>setText(QString::number(20,16));
        ②将字符串转换成基本数据类型
             
        toDouble (bool *) const : double
        toFloat (bool *) const : float
        toInt (bool *, int ) const : int
        举例说明:
                int QString::toInt(bool * ok = nullptr, int base = 10) const
                 该函数为 普通的成员函数 ,将字符串转换成基本数据类型
                
                参数:
                        
                        参数一:bool *ok ----- > 输出参数 转换成功,返回true,否则,返回false
                        参数二:int base = 10 ---- 设置数据的进制,默认为十进制

                        返回值:得到基本类型数据 "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 -----> 要传入的参数的值

                                 返回 值:QString

                                

                        举例说明:         

//为了实现动态的参数传入,那么使用%来实现提前占位符,比如 %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文件中,右击控件 -----> 选择 转槽 ----- 通常应用在界面上给指定的控件设置动态

交互
        3.1多界面编程思路
                

                 0步:创建一个界面类,在Qt中创建一个界面类:.h .cpp .ui

                第一步:创建另一个界面的对象

                第二步:显示要跳转的界面

                第三步:关闭或者隐藏当前的界面      
                
                           
//如果账号和密码正确,进行到管理员界面 ‐‐‐‐ 启动管理员界面(多界面编程)
/第一步:创建另一个界面的对象
AdminWindow* admin = new AdminWindow; //不能创建在栈上
//第二步:显示要跳转的界面
admin‐>show();
//第三步:关闭或者隐藏当前的界面
this‐>close(); 
在Qt中,创建一个界面类的方式和设置

        第一步:右击项目 ---- > new(创建文件),在弹出的对话框中,选择如下设置

第二步:选择下一步,在弹出的对话框,选择界面的模板

 第三步:选择下一步,设置界面类的名字

 第四步:点击下一步,完成 即可。

         3.2 界面跳转携带数据 ---- 信号和槽(signal and slot)

                在qt中,因为不同界面,本质上就是不同的类的对象,说到底还是不同类之间的数据传输,

                使用信号和槽来实现(Signals and slots are made possible by Qt's meta-objectsystem--qt元对象系统)    

4.信号和槽      

1. 信号和槽基本概念
信号和槽就是用于对象之间的数据通信,该机制是QT特有的,跟其他的框架不同,信号和
槽相当其他的通信机制,要更加安全。
信号 ----- > 函数,该函数不需要实现
槽 ------> 函数,该函数需要实现
2.信号和槽使用

在qt中,有很多的预定义信号和槽,除此之外,自己可以根据需求来自定义信号和槽,然
而,当一个信号发生时,那么跟它建立的槽就 会被调用,来做为做信号的回应。使用
connect函数来建立信号和槽连接。
对象之间通信的步骤:
第一步:创建对象一       定义或者使用系统的信号和槽
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来连接两个对象之
间通信
         connect ( sender , & QObject :: destroyed , this , & MyObject :: objectDestroyed ) 
        参数一: 信号的发送者 ‐‐‐ 对象一 指针类型
        参数二:对象一要发送的信号 写法: & 对象一类名 :: 信号名字 指针类型     
        参数三:信号的接收者 ‐‐‐ 对象二 指针类型     
        参数四:对象二回应信号的槽函数 写法 : & 对象二类名 :: 槽函数名字 指针类型
注意connect实际上还有第五个参数,后面会有专门的说明
        
注意事项:
        1)对象一和对象二可以是同一个对象,自已发送信号,自己接收并回应
        2)connect函数作用是说明两个对象建立一个信号和槽的关系,并不会执行这
        个函数体
        3)可以设置在构造函数,或者自己认为要放的地方
connect(this,&LoginWin::sendUserName ,sw,&SystemMainWindow::getUserData);
connect函数原型:
[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
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设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

参考博客

https://www.cnblogs.com/al-fajr/p/11878427.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值