常见对象:
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 QStatusBarQMainWindow 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;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。