常见对象: page 30

看帮助文档应该是最重要的能力

QT creator的F1按钮可以帮你解决很多问题

  • QTcreator自带的example and assistant 都是自我学习的好资源

  • 对QT能做什么,有什么widgets,有所了解后,使用assistant的搜索功能,基本可以解决所有问题

Qt的宏观继承关系

QObject为祖先,
在此基础上,派生出三个不同特色的类
QCoreApplication--->QApplication:功能单一的对象,进入消息循环
QWidget :  各类可视化的窗口widgets
QLayout : 各类用来 addWidget and addLayout 的容器

小物件button

  • QPushButton QToolButton QCheckBox QRadioButton

  • Bar系列:
    QToolBar QMenuBar QStatusBar

  • QMainWindow QDialog

放其它物件的物件,单页容器

  • QGroupBox QFrame

放其它物件的物件,多页容器窗口部件

  • QToolBox QTabWidget

视图窗口部分,也是放其它窗口的

  • QListView QTreeView

  • QListView QTableView
    上面的是view对象

提供信息给用户看的widget

  • QLabel QLCDNumber QProcessBar

  • QTextBrowser

与用户互动的widget(需要用户输入信息)

  • QSpinBox QDoubleSpinBox QComboBox

  • QDateEdit QTimeEdit QDateTimeEdit

  • QScrollBar QSlider QLineEdit

  • QTextEdit QDial

几个dialog

  • QInputDialog QProgressDialog

  • QMessageBox QErrorMessage

  • QColorDialog QFontDialog

  • QPageSetupDialog QFileDialog

  • QPrintDialog


关于qrc文件中的资源使用问题

  • qrc的文件的内容是编译到代码中了,最后生成的可运行文件中是含有文件信息的

  • 基于上面的原则,所以我们在read一个文件资源时,可以使用qrc方式添加文件的资源

  • 但是如果你需要创建一个新的文件,则需要通过指定路径,来确定在什么路径新建一个文件,然后在该路径中对文件进行写入操作

QLabel设置字体大小

    QFont ft;
    ft.setPointSize(100);
    
    QLabel * label=new QLabel("text here");
    label->setFont(ft);
    label->setText("hello world");  //"<h2>hello world</h2>" 使用简单的html样式,非常不错哦
    label->show();

最小应用程序

#include<QApplication> 
QApplication app(argc,argv);

return app.exec();
所以的widget在show()前都是隐身的,所以在这之前,可以设置好各类需要设置的参数

程序的编译

qmake -project  #产生一个.pro文件
qmake xx.pro    #产生一个makefile文件
make            #编译整个程序

.pro文件如果是Qtcreator自动生成的,就不要人为改变了
QT +=widgets      #会导入 QApplication需要的文件,所有widgets都需要这个model

一些重要的需要理解的思想

app.exec();使程序进入了等待模式,事件循环状态。
等待用户输入或是某个状态的发生,然后调用相应的槽函数
信号就是用户的输入,或是某个状态
槽就是信号对应的会调用的一个函数
事件循环就是等待信号发生,然后调用与信号挂钩的槽函数
工作原理:
信号--> 槽函数
信号--> 事件-->槽函数
本质来说槽函数,就是对信号的一种响应
书只能引导你去深入学习,不能覆盖所有的内容、方法技巧,要学会自己深入的思考,发现发明更多的模式

关于QPushButton

对于一个button, 当我们用鼠标点击后,就会产生一个clicked()的信号
我们要将这个信号,与我们想要 按下鼠标完成 的事情联系到一起,就是我们上面说的槽函数,这样就完成了点击鼠标,做我们想做的事情的目的,这种简单的思想,却是gui消息编程的核心。

QPushButton *button =new QPushButton("clicke me");
button->setFont(ft); //这样设置button的显示字体
QObject::connect(button,SIGNAL(clicked()),&app, SLOT(quit());
//用户点了button后,会产生clicke()信号,信号已经与app对象的quit()函数绑定了,所以接下来会调用quit()函数
//最终给用户的结果是:用户点button -->调用 app.quit();

//上面可以看到connect函数,就是把信号与某个对象的一个函数绑定
//app是一个全局变量,&为取app的地址,传入给connect函数
//只有知道app这个对象的地址,才能顺序的调用这个对象的quit()函数

这个函数是把信号和槽函数绑定起来的桥梁,所以以后会经常看到:
QObject::connect(button,SIGNAL(clicked()),&app, SLOT(quit());

宏SIGNAL SLOT 属于QT的语法,规则而已。

关于QSlider and QSpinBox

都有setRange()的函数
都有valueChanged(int)的信号
都有setValue(int)的函数
slider->setOrientation(Qt::Horizontal);
这些就够了

QWidget也是一个非常大的空白wiget,可以在里面入QHBoxLayout
widget->setLayout()实现
QHBoxLayout and QVBoxLayout的重要方法是addWidget();

写自己的槽函数

#注意下面的Q_OBJECt 这个宏,必需要的,
#如果出现undefined reference to `vtable for,
#这里因为这包含Q_OBJECT这个宏的cpp or .h文件没有被 QT的mooc编译器编译过,需要想办法让mooc编译器编译这个文件
#最容易的办法是自己得新 新建一个.h .cpp的类文件,然后再写自己的类
#这样Qt creator会帮你搞定一切,不要直接在main.cpp写带Q_OBJECT的类

#下面的这个Myobject对象起到一个桥梁的作用,通过绑定了槽函数后,可以把其它两个不相关的对象联系起来,
#button的clicked与Myobject的槽联起来,而Myobject的槽可以操作内部指针spin变量的信息
#这是一个简单的模型,把不相关的对象联系起来,
#也就是Myobject这个对象的内部指针足够多,槽函数足够多,那么就可以把很多对象的动作绑定起来

class Myobject:public QObject {
 Q_OBJECT
public:
    QSpinBox *spin;
    int min,max;
    Myobject()
    {

    }
    ~Myobject()
    {

    }

    void setSpinBox(QSpinBox *spin,int min,int max)
    {
        this->spin=spin;
        this->min=min;
        this->max=max;
    }
private slots:
    void addslot()
    {
        int value=spin->value();
        value++;
        if(value>max)value=min;
        spin->setValue(value);
    }
    void subslot()
    {
        int value=spin->value();
        value--;
        if(value<min)value=max;
        spin->setValue(value);
    }
};

widget之间相互包含的调用函数

QBoxLayout 之间 使用addLayout()函数
QBoxLayout 加入QWidget时,使用addWidget()函数
QWidget    加入QBoxLayout时,使用setLayout()函数

写自己的对象,使用自己的slots

#对象之间想要进行数据的传递,沟通
#除了全局变量以外,最重要方式就是使用signal-slot了
#对象A通过信号 函数emit Asignal(da,db,dc)
#对象B通过槽函数 可以得到对象A传过来的数据  Bslot(da,db,dc)
#然后在槽函数中进行 进一步处理
#重要的一步就是A的信号和B的槽的绑定connect(A,SIGNAL(),B,SLOT())
#对象A在什么适当的时间发射出带有数据 的信号 这是个关键问题(也是问题驱动的问题)
#自己写的信号函数:实际上不是一个真正的函数,
#信号函数只有函数名,没有实现,负责调用绑定的槽函数,同时传递部分数据到槽函数

class MyLabel:public QLabel
{
    Q_OBJECT
public:
    MyLabel()
    {
        setText("you want to find:");
    }

private slots:
    void getFindb(Qt::CaseSensitivity cs,QString text)
    {
        this->setText("you want to findb:"+text);
        QTextStream qcout(stdout);
        qcout<<"i get what u want to find:"<<text<<endl;
        qcout<<"casesensitivity:"<<cs<<endl;
    }
    void getFindf(Qt::CaseSensitivity cs,QString text)
    {
        this->setText("you want to findf:"+text);
        QTextStream qcout(stdout);
        qcout<<"i get what u want to find:"<<text<<endl;
        qcout<<"casesensitivity:"<<cs<<endl;
    }

};

猫哥
305 声望44 粉丝

热衷于研究各类互联网技术,热爱学习,热爱生活!