1.e.g:
//新建owidget类对象,默认parent参数是0,所以它是个窗口
Qwidget *widget = new Qwidget();
//设置窗口标题
widget->setwindowTitle(Qobject: :tr("我是widget"));//新建QLabel对象,默认parent参数是0,所以它是个窗口
QLabel *label = new QLabel () ;
label->setwindowTitle (Qobject: :tr("我是label"));
label->setText (Qobject: :tr ( "label:我是个窗口"));
//改变部件大小,以便能显示出完整的内容
label->resize (350,20) ;
//label2指定了父窗口为widget,所以不是窗口
QLabel *label2 = new QLabel (widget) ;
label2->setText (Q0bject::tr ("label2:我不是独立窗口,只是widget的子部件"));
label2->resize (350,20);
label ->show();
widget ->show();
delete label;
delete widget;
return a.exec();;
程序中定义了一个QWidget类对象的指针widget和两个QLabel对象指针label与 label2,其中label 没有父窗口,而label2父窗口为widget;
注意: 这里使用new操作符为label2分配了空间,但是并没有使用delete进行释放,这是因为在Qt中销毁父对象的时候会自动销毁子对象,这里label2指定了parent为widget,所以在delete widget时会自动销毁它。
2. 窗口部件: 像主窗口、对话框、标签、按钮、文本输入框等都是窗口部件。这些部件可以接收用户输入,显示数据和状态信息,并且在屏幕上绘制自己。有些也可以作为一个容器来放置其他部件。Qt中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的widget和 label一样。
3. 子部件: 窗口就是没有父部件的部件。与其相对的是非窗口部件,又称为子部件。如程序中的 label2。
4. 窗口类型: 比如QWidget中有一个setWindowState()函数用来设置窗口的状态;其参数由Qt::WindowStates指定,是Qt::WindowState枚举类型值的或组合。窗口状态Qt :: WindowState包括最大化Qt::WindowMaximized、最小化Qt :: WindowMinimized,全屏显示Qt :: WindowFullScreen和活动窗口Qt::WindowActive等。默认值为正常状态Qt::WindowNoState。
e.g:
Qwidget *widget = new QWidget (0,Qt::Dialog | Qt ::FramelesswindowHint);//产生一个没有边框的窗口
QLabel *label = new QLabel(0,Qt::SplashScreen | Qt::windowStaysOnTopHint);//使窗口停留在其他窗口上面
5.几何布局:
对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取它们的数值。(分包含框架和不包含框架)
e.g:
widget.resize(400,300);
设置窗口大小
widget.move(200,100);
//设置窗口位置
widget.show();
int x =widget.x();
//输出x的值
qDebug("x:%d",x);
int y = widget.y();
qDebug("y;%d",y);
QRect geometry = widget.geometry();
QRect frame = widget.frameGeometry();
qDebug()<<"geometry: "<<geometry<<"frame: "<<frame;.
说明:
(1) 这里用到了qDebug打印信息,要在头文件加上#include< QDebug>,且用了两种方法可以打印出信息。
(2) x()、y()分别返回部件的位置坐标的x、y值,它们的默认值为0。
(3) geometry()和frameGeometry()函数分别返回 没有边框 和 包含边框 的窗口框架矩形的值,其返回值是QRect类型的,就是一个矩形,它的形式是(位置坐标,大小信息),也就是(x,y,宽,高)。
1.概念: 信号和槽都是函数,是在Qt中来完成对象之间的协同操作。
2.关联方式
2.1 手动关联:connect()函数
connect()函数中的四个参数分别是:发送信号的对象、发送的信号、接收信号的对象和要执行的槽,而信号和槽要分别使用SIGNAL()和SLOT()宏括起来。
步骤 e.g :
① 在头文件(.h)中写槽的声明:如
public slots: void showDialog () ;
②在对应c文件中写槽函数的实现:如
void Mywidget: :showDialog ({
QDialog *dialog=new QDialog (this);
dialog->show();
}
③在c文件的MyWidget类的构造函数中使用connect()关联按钮单击信号和自定义的槽如下:
connect (ui->showButton,SIGNAL (clicked ()),this, SLOT (showChildDialog ()));
2.2 在设计模式中关联
点击设计器上方的“编辑信号/槽”图标,或者按下快捷键F4,这时便进入了部件的信号和槽的编辑模式。在“退出”按钮(提前拖上一个push button)上按住鼠标左键,然后拖动到窗口界面上,这时松开鼠标左键。在弹出的配置连接对话框中,选中下面的“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后按下“确定”。
2.3 自动关联: 利用在控件(如按钮)右键转到槽,然后在生成的槽函数中编写代码即可
1.概念: Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。
2.颜色对话框:
QColor color = QColorDialog: :getColor(Qt::red,this,tr("颜色对话框"));qDebug () <<"color: " <color;
3.文件对话框:
QString fileName = QFileDialog: :getOpenFileName(this, tr("文件对话框"),
"D:",tr("图片文件(* png * jpg)"));
qDebug( "fileName:"< fileName;
4.消息对话框:
//问题
int ret1 = QMessageBox: : question(this, tr("问题对话框"),
tr("你知道吗?"),QMessageBox::Yes,QMessageBox::NO);
//提示
int ret2= QMessageBox;;information(this,tr("提示对话框"),
tr("这是Qt!"),QMessageBox::0k);
//警告
int ret3 = QMessageBox;:warning(this,tr("警告对话框"),
tr("不能提前结束!"),QMessageBox::Abort);
5.进度对话框:
QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);dialog. setWindowTitle(tr("进度对话框"));
//设置窗口标题
dialog.setWindowModality(Qt::WindowModal);
//将对话框设置为模态
dialog. show();
for(int i=0;i<50000;i++){
//演示复制进度
dialog. setValue(i);
//设置进度条的当前值
QCoreApplication: : processEvents();
//避免界面冻结
if(dialog.wasCanceled()) break;
}
//按下取消按钮则中断
dialog. setValue(50000);
//这样才能显示100% ,因为for 循环中少加了一个数
qDebug()<< tr("复制结束!");
setTabOrder(ui->lineEdit,ui->spinBox); //lineEdit在spinBox前面
setTabOrder(ui->spinBox,ui->pushButton); //spinBox在pushButton前面
setTabOrder(ui->pushButton,ui->checkBox); //pushButton在checkBox前面
参考书目: Qt Creator快速入门第三版霍亚飞编著-北京航空航天大学出版社