【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

简介: <p><span style="font-family:'Microsoft YaHei UI','Microsoft YaHei',SimSun,'Segoe UI',Tahoma,Helvetica,sans-serif,'Microsoft YaHei',Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,serif; line-height

Qt是一个跨平台的c++图形用户界面应用程序框架。

Qt安装说明:

windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行
C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin;


linux下需要设置.bash_profile文件
PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin
用root用户登录系统,进入/usr/lib目录后执行
ln libGL.so.1 libGL.so

1.入门程序

界面程序:求两个整数的和。
用到的控件:
lineEdit 
pushButton
label
给按钮添加事件:右键, 转到槽, click信号。
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.setWindowTitle("diyige progma");//设置窗口标题
    w.show();

    return a.exec();
}

void Widget::on_pushButton_clicked()
{
    QString s1 = ui->lineEdit->text();//得到lineEdit中用户输入的文本
    QString s2 = ui->lineEdit_2->text();
    int a = s1.toInt() + s2.toInt();//将文本转化为整数后相加
    ui->label->setText(QString::number(a));//将整数转化为QSting类型,然后设置lable的text
}





2.qt程序移植


linux下qt程序移植:将windows下面编写的源代码(不要.user)复制到linux系统用户目录下面。
cd 回家, 切换到用户的主目录。
修改.bash_profile,添加PATH变量中qmake的路径。
qmake 命令添加到环境变量中。
qmake生成Makefile, 然后make进行编译。
编译过程中报错,缺少LG库。
以root用户切换到 /usr/lib、 查看 ls libGL.so*
发现有待版本号后缀的库文件。libGL.so.1     libGLso.2
建立快捷方式:ln libGL.so.1 libGL.so
再次编译,生成可执行程序,在图形界面下面,双击执行程序。


3.环境变量的设置


如何在windows下面找到xx.exe程序直接双击,提示找不到库不能运行,需要将qt安装时候的路径
为了使qt写的应用程序能够离开qt开发环境单独运行,需要修改windows下面的path环境变量。
C:\Program Files\ARM\ADSv1_2\bin;D:\android_env\android-sdk-windows\platform-tools;%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\VisualSVN Server\bin;D:\Program Files\TortoiseSVN\bin;D:\Program Files\Altium Designer Summer 09\System;C:\Program Files\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;D:\Qt\Qt5.2.0\Tools\mingw48_32\bin;D:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin


4.用代码实现界面


创建项目,注意去掉对勾。


//dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
//控件头文件
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
private:
    QPushButton *btn1;
    QLineEdit *edit1, *edit2;
    QLabel *label1;
private slots://槽
    void add();
};

#endif // DIALOG_H

//dialog.cpp
#include "dialog.h"
#include <QGridLayout>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    //实例化成员
    btn1 = new QPushButton(this);
    edit1 = new QLineEdit(this);
    edit2 = new QLineEdit(this);
    label1 = new QLabel(this);

    btn1->setText("求和");
    label1->setText("label");
    QGridLayout *layout = new QGridLayout(this);
    layout->addWidget(edit1, 0, 0);
    layout->addWidget(edit2, 0, 1);
    layout->addWidget(btn1, 1, 0);
    layout->addWidget(label1, 1, 1);
    //将btn1的点击事件和add()关联
    connect(btn1, SIGNAL(clicked()),this, SLOT(add()));
}

Dialog::~Dialog()
{

}

void Dialog::add()
{
    QString s1 = edit1->text();//得到edit1控件中输入的文本
    QString s2 = edit2->text();
    bool ok = false;
    int a = s1.toInt(&ok, 16);
    if (ok == false)
    {
        return;
    }
    int b = s2.toInt(&ok, 16);//转化为16进制整数后求和
    if (ok == false)
    {
        return;
    }
    label1->setText(QString::number(a+b, 16));
}

//main.cpp
#include "dialog.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.setWindowTitle("用代码实现的界面:16进制计算");
    w.show();

    return a.exec();
}


void Dialog::add()
{
    QString s1 = edit1->text();//得到edit1控件中输入的文本
    QString s2 = edit2->text();
    QString s3;
//将QString转化为c风格的const char * 字符串
//利用sprintf()进行格式化输出
    s3.sprintf("%s,%s", s1.toStdString().data(), s2.toStdString().data());

    label1->setText(s3);
}

5.控件

[Tool Button ] autoraise属性
[check box]

void Widget::on_pushButton_clicked()
{
    //判断是否选中状态
    if(ui->checkBox->checkState())
        ui->label->setText("true");
    else
        ui->label->setText("flase");
}


[comboBox]下拉列表
右键-->编辑项目-->加号
[fontComboBox]字体选择下拉列表
[textEdit]

void Widget::on_pushButton_clicked()
{
    ui->label->setText(ui->textEdit->toPlainText());
}


常用控件:
QDateTime类,头文件#include <QDateTime>可以使用QDateTime类来获得系统时间。
通过QDateTime::currentDateTime()来获取本地系统的时间和日期信号。可以通过date()he 
time()来返回datetime中的日期和时间部分:

#include "QDateTime"
void Widget::on_pushButton_clicked()
{
    QDateTime *time1 = new QDateTime(QDateTime::currentDateTime());
    this->setWindowTitle(time1->date().toString());
}


常用控件:
QTime类:定时器(QTimer)
新建一个定时器。QTimer *time_clock = new QTimer(this);
连接这个定时器的信号和槽,利用定时器的timeout()。
connect(time_clock, SIGNAL(timout()), this, SLOT(slottimedone()));
time_clock->start(1000);
开启定时器,并设定定时周期。
定时器定时有两种方式,start(int time)和setSingleShot(true).其中,start(int time)表示
每个“time"秒就会重启定时器。可以重复触发定时,利用stop()将定时器关掉;而
setSingleShot(true)则是仅启动定时器一次。

void Dialog::add()
{
    if(time1->isActive())//如果按钮激活,停止及时
        time1->stop();
    else
        time1->start(1000);//每隔1s执行一次on_time函数
}

void Dialog::on_time()
{
    QDateTime *date1 = new QDateTime(QDateTime::currentDateTime());
    QString s;
    s.sprintf("%d:%d:%d",date1->time().hour(),date1->time().minute(),date1->time().second());
    setWindowTitle(s);
}


常用控件
创建窗口
如果widget未使用父级进行创建,则在显示时视为窗口或顶层widget.
由于顶层widget没有父级对象类来确保在其不再使用时就删除,所以需要
开发人员在应用程序中对其进行跟踪。
在本例中,使用QWidget创建和显示具有默认大小的窗口:

void Dialog::add()
{
    QWidget *window = new QWidget();
    window->resize(320, 240);
    window->show();

    QPushButton *button = new QPushButton(tr("Press me"), window);
    button->move(100, 100);
    button->show();
}





目录
相关文章
|
3月前
|
编解码 UED
Qt侧边栏的动态切换:隐藏与显示技术详解
在现代用户界面设计中,侧边栏(Sidebar)是一个常见的组件,它为用户提供了导航和工具面板的功能。在某些应用场景下,我们可能需要动态地隐藏或显示侧边栏,以优化界面布局或提供更灵活的用户体验。本文将分享如何在Qt框架下实现侧边栏的隐藏与呈现,包括技术细节和代码示例。
260 3
WK
|
3月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
98 5
|
3月前
|
UED
Qt侧边栏的动态展示:隐藏与呈现技术详解
在现代用户界面设计中,侧边栏(Sidebar)是一个常见的组件,它为用户提供了便捷的导航和操作入口。在Qt框架中,实现侧边栏的隐藏与呈现不仅能够提升应用的美观度,还能增强用户体验。本文将详细介绍如何在Qt中实现侧边栏的动态隐藏与呈现,包括技术要点和代码实现。
226 0
|
4月前
|
Unix Linux C++
Linuxc/c++之信号基础
这篇文章详细介绍了Linux下C/C++信号的基本概念、产生原因、处理过程、分类、注册与发送方法,以及信号屏蔽的机制。
34 0
Linuxc/c++之信号基础
|
5月前
Qt开发
Qt开发
|
5月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。
119 0
|
6月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
256 2
|
6月前
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
111 0
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
67 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
46 13