1,使用Qt面向对象类继承创建第一个窗口主部件,使用setMinimumSize(),setMaximumSize()配置主部件窗口是否能够resize;
QWidget::setGeometry()窗口大小在屏幕上的显示位置
QWidget::setGeometry()函数设置窗口首次显示在屏幕上时的大小和位置,窗口显示后可被移动或是改变大小;
QWidget::setGeometry()4个函数参数解读
前2个参数决定窗口在整个显示屏上的位置,后两个参数 决定窗口的大小(长宽)
setMinimumSize(),setMaximumSize();
2,主窗口部件添加对象(button,scroll bar,label)
向窗口添加与用户交互对象,发挥窗口用处,因为窗口是干不了啥事的!!!
向新创建的窗口上添加对象,添加对象时this -pointer很重要
测试向主部件窗口添加按钮
部分Codes
3,格式按钮上的文本,QPushButton::setFont();
4个参数说明,字体Courier,Times,气体大小--像素,文本加粗QFont::Light,Weig,ht文本是否为粗体(True/False)
b1->setFont(QFont("Courier",12,QFont::Light,TRUE));
5,主窗口部件添加标签
无论你所添加的部件是什么,想窗口中添加子部件的过程基本一致,eg:向窗口中添加文本标签,使用QLabel class
具有一个按钮和标签的MyMainWindow Objects;
6,主不见你中添加按钮点击事件-退出按钮,Qt类库与用户的交互方式,响应用户操作,其他GUI库使用回调函数方式,Qt使用信号和槽
信号和槽是相互关联的函数.信号Signal-->实际是一个函数,执行时与该信号相连接的槽Slot-->实际也是个函数也执行
测试建立退出按钮
b1按钮的clicked()信号与qApp的quit()槽相连接,当点击按钮时,将产生QPushButton::clicked()信号,导致qApp的quit()槽被执行,从而使程序退出.qApp是Qt的一个内置指针,总是指向程序中QApplication对象,工作方式与this指针相同,指向一个还没有创建的对象
设置label的alignment 报错信息
click.cpp: In constructor ‘MyMainWindow::MyMainWindow()’: click.cpp:27:22: error: ‘Alignment’ was not declared in this scope label->setAlignment(Alignment); ^ click.cpp:27:22: note: suggested alternative: In file included from /opt/Qt5.4.1/5.4/gcc_64/include/QtCore/qglobal.h:1085:0, from /opt/Qt5.4.1/5.4/gcc_64/include/QtCore/qcoreapplication.h:37, from /opt/Qt5.4.1/5.4/gcc_64/include/QtWidgets/qapplication.h:37, from /opt/Qt5.4.1/5.4/gcc_64/include/QtWidgets/QApplication:1, from click.cpp:1: /opt/Qt5.4.1/5.4/gcc_64/include/QtCore/qnamespace.h:250:21: note: ‘Qt::Alignment’ Q_DECLARE_FLAGS(Alignment, AlignmentFlag) ^ /opt/Qt5.4.1/5.4/gcc_64/include/QtCore/qflags.h:155:22: note: in definition of macro ‘Q_DECLARE_FLAGS’ typedef QFlags<Enum> Flags; ^ click.cpp: In function ‘int main(int, char**)’: click.cpp:37:22: error: ‘argv’ was not declared in this scope QApplication a(argc,argv); ^ click.cpp:40:4: error: ‘class QApplication’ has no member named ‘show’ a.show(); ^ click.cpp: At global scope: click.cpp:35:5: warning: unused parameter ‘agrv’ [-Wunused-parameter] int main(int argc,char **agrv) ^ make: *** [click.o] Error 1
总结---Qt用户交互---信号和槽
7,调整主窗口,其他对象位置错乱 ----> 布局管理器layout manager;
实战Qt槽信号--用户交互
Qt部件与用户的交互方式不同于其他GUI工具包,用户交互是所有GUI应用程序关心 的问题,通过将某种用户事件(鼠标点击)与程序事件(例如程序退出)联系起来,使用户能够在图形界面中只使用鼠标来控制程序.
其他GUI工具包使用回调函数创建用户交互,Qt中使用信号和槽只需一行代码就能将用户事件和程序事件连接起来;
使用Qt自带的信号和槽及创建自己的信号和槽--->使用元对象编译器(Meta Object Complier,MOC)实用程序
8,解读信号和槽
信号signal和槽slot,传统技术回调call back
槽信号--用户交互方法术语:
用户事件-->
程序事件-->程序所产生的事件,eg:用户点击鼠标后程序退出;
发射信号-->点击鼠标,发射clicked()signal.为了发射信号使用emit key words;
内部状态-->
MOC-->元对象编译器用于构造用户自己的信号槽,处理Qt特有的关键字emit,创建合法的C++代码
槽:实际槽是标准的成员函数,只是这个成员函数增加了一些特殊功能,能够连接到信号.每当槽所连接的信号被发射时,槽(类成员函数)被执行,创建自己的槽slot实际上是在编写一个普通的类成员函数.
Qt class 预定义槽--QPushButton 所包含的clicked()函数;
总结:槽--实际是类标准成员函数.
信号--也是成员函数,当对象内部发生某些事件(其内部状态发生变化)、它能够发出信号,如果这个信号连接到槽,那么这个槽函数即将被执行,可以将多个槽连接到同一个信号
总结:信号-被定义为当某个事件发生时将被发射,之后执行所有被连接的槽.
9,使用Qt预定义的信号和槽,实现退出按钮功能,将按钮QPushButton的clicked()信号signal连接到qApp的quit()槽.使得每当发射clicked()信号时,程序便执行quit()槽(函数).
9.1 Signal,slot--Example:
QSlider滑动,QLCDNumber
槽信号头文件
问题排错,
演示具有滑块和LCD显示的信号和槽应用案例
slider的valueChanged()信号被连接到lcd的display()槽/
11,QPushButton.QLineEdit
QPushButton的clicked()信号,连接到QLineEdit类所包含的3个不同槽,达到点击按钮就能控制QLineEdit对象中文本--Qt reference Document.
12,创建用户自己定义的信号和槽,使用元对象编译器
moc(meta object Compiler)
moc infile.h -o outfile.moc 命令读取infile.h文件,该文件中声明Qt类,以及信号和槽,然后根据它创建有效的C++代码,将生产的代码写入到outfile.moc;
将生成的moc文件包含到cpp源码 或是下面的另外一种使用moc文件
g++ -c outfile.moc -o outfile.o
g++ -c infile.cpp -o infile.o
g++ -lqt outfile.o infile.o -o MyProgram;
信号和槽--都是类内成员函数,声明用户槽,使用特殊的关键字使Moc能够将槽和其它成员函数区分开来.
class MyMainWindow : public QWidget
{
Q_OBJECT
public:
MyMainWindow();
public solts:
MyExitSolt();
}
13,上面是一个槽的声明定义实现,它是以stdlib.h中定义的exit()函数是程序退出
编译和使用用户槽程序:
Notices:当程序中所使用的类具有用户槽和信号,需要使用moc
$moc ClassDeclaration.h -o ClassDeclaration.moc;
然后在cpp程序源码文件中包含moc文件
#include <ClassDeclaration.moc>
$g++ -lqt ClassDeclaration.cpp Main.cpp -o MyProgram;
将moc文件编译为目标文件,把它与ClassDefinifion.cpp和main.cpp一起链接
$moc ClassDeclaration.h -o ClassDeclaration.moc(使用moc将槽的类成员函数声明定义头文件使用元对象编译器将它编译为moc文件)
$g++ -c ClassDeclaration.moc -o ClassDeclaration.o 将上面生成的moc文件使用g++编译器将其生成目标文件
$g++ -c ClassDefinition.cpp -o ClassDefinition.o
g++ -c main.cpp -o main.o
$g++ -lqt ClassDeclaration.o ClassDefinition.o main.o -o MyProgram;
13,创建用户信号
类声明中声明用户信号,public slots
signal:
创建用户信号和槽--所需要做的第一件事就是在类声明中声明槽和信号,槽实际上是一个普通成员函数,但是需要使用特殊关键字,使moc能够将槽和其它成员函数区分
class MyMainWindow : public QWidget
{
public:
MyMainWindow();
};
class Ruiy
{
//some codes;
};
槽声明语句:
class MyMainWindow : public QWidget { Q_OBJECT public: MyMainWindow(); public solts: MyExitSolt(); };
Notices:所有用户信号和槽的Qt类都必须用到这个宏Q_OBJECT;
新语法定义的新的函数public solts:叫做槽
public solts:下面的所有行语句都表示槽
Eg:槽定义defined
#include <stdlib.h> #include <qpushbutton.h> //The solt int MyMainWindow::MyExitSolt() //类的其中一个成员函数 { //类成员函数,public solts: MyExitSolt(); //use the exit() function defined in stdlib.h exit(0); } //构造函数,析构函数 //The constructor MyMainWindow::MyMainWindow() { //some code //connect a button to our custom solt: connect(MyButton,SIGNAL(clicked()),this,SLOT(MyExitSolt())); }
创建用户信号
class MyMainWindow : public QWidget { Q_OBJECT//宏引用 public: MyMainWindow();// SetValue(int); public solts: ChangeValue(int); signals: ValueChanged(int); };
SetValue(int)普通函数,当新值传递给SetValue()函数时,SetValue()函数调用ValueChanged()信号,通过将ValueChanged()信号连接到ChangeValue()槽;
void MyMainWindow::SetValue(int value) { if (value != oldvalue) { oldvalue = value; emit ValueChanged(value);//发射信号 } }
上面SetValue函数表明您只有当新值与旧值不同时才发射信号ValueChanged(),oldvalue将被修改为value,并发射ValueChanged()信号,信号与槽一类的普通类成员函数不同,信号只能使用emit关键字发射信号
ChangeValue()define定义:
void MyMainWindow::ChangeValue(int value)
{
functionForChangingTheValue(value);
}
调用FunctionForChangingTheValue()修改数据SetValue;
connect(this,SIGNAL(ValueChanged(int)),this,SLOT(ChangeValue(int)));
14,信号和信号直接的连接
connect(button,SIGNAL(clicked()),this,SIGNAL(anothersignals()));
15,端口槽和信号之间的连接:
QObject::disconnect()函数能够实现 断开信号和槽的连接
disconnect(button,SIGNAL(clicked()),qApp,SLOT(quit()));
16,使用connect()函数时省略对象名称--将信号连接到当前所定义类槽,可以省略拥有该槽的对象名称
MyWidget::MyWidget()//构造函数 { //some code here including the definition of button; //and then the call to connect() connect(button,SIGNAL(clicked()),this,SLOT(ckearFocus())); }
connect()函数默认为当前所定义对象;
总结--信号与槽::--App如何与用户进行交互,也是GUI程序设计的全部思想.
17,深入Qt构造块;
Qt为创建GUI程序所提供的类库--contents,滚动条scroll bar,menu,file I/O QMainWindow
17.1向GUI程序中添加滚动条,是现代GUI应用程序能够在较小的区域放置多个部件,现代GUI应用程序中使用菜单已经成为一种标准,用于向用户显示程序功能和选项,使组织功能和选项功能更简单
使用滚动条:
使用Qt时,实现滚动条功能最简单的方法是将主部件(主窗口)基于QScrollView类,之后再为每个窗口调用QScrollView::addChild()函数,就能够自动创建一个按需滚动窗口(即只有当窗口无法在其原来尺寸下显示出所有子部件时它才添加滚动条)
18,类对象函数
QScrollView::addChild();
使用程序实现滚动条
使用程序实现菜单menu()
QMenuBar and QPopupMenu,QPopupMenu代表单个菜单,而QMenuBar表示整个菜单,QPopupMenu对象创建几个菜单项的菜单条;
19,创建单个及多个条目的菜单
20,QMainWindow部件