Qt学习笔记(一)

这篇博客详细介绍了Qt编程的基础知识,包括项目创建、信号与槽的使用、Qt类构造、动态对话框的创建、内置窗口部件和对话框、资源管理、菜单和工具栏的构建、上下文菜单、状态栏、消息框以及文件的读写操作。还探讨了对话框的模态与非模态、QSettings的使用、QSplashScreen实现启动界面、中央窗口部件的设置,以及自定义窗口部件的创建。
摘要由CSDN通过智能技术生成

1、在Qt Creator中创建项目,当工程更改之后,要注意经常qmake以保持最新状态。

2、qt中的信号和槽  signal  slot

任何使用 信号和槽的类在头文件中必须 进行Q_OBJECT 宏声明。

槽和普通的C++成员函数几乎是一样的----可以是虚函数;可以被重载;可以是公有的、保护的或者私有的,并且也可以被其他C++成员函数直接调用;他们的参数可以是任意类型。唯一不同的是:槽还可以和信号直接连接在一起,在这种情况下,每当发送这个信号的时候,就会自动调用这个槽函数。

connect(sender,  SIGNAL(signal), receiver, SLOT(slot));

sender 和 receiver都是QObject的指针,signal和slot是不带参数的函数名。实际上SIGNAL和SLOT宏会将他们的参数转换成相应的字符串。

 connect(lineEdit, SIGNAL(textChanged(const QString&)),  this, SLOT(enableFindButton(const QString&)));
(1)一个信号可以连接多个槽,当发射这个信号的时候,会以 不确定的顺序一个接一个的调用这些槽。

connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));

connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));

(2)多个信号可以连接同一个槽,无论发射的是哪一个信号都会调用这个槽

connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError());

connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));

(3)一个信号可以与另外一个信号相连接,当发射第一个信号时,也会发射第二个信号。除此之外,信号与信号之间的连接和信号与槽之间的连接是难以区分的。

connect(lineEdit, SIGNAL(textChanged(const QString&), this, SIGNAL(updateRecord(const QString&)));

(4)连接可以被移除, 这种情况较少用到,因为当删除对象时,Qt会自动移除和这个对象相关的所有连接。

disconnect(lcd, SIGNAL(overflow()), this,  SLOT(handleMathError()));

要把信号成功连接到槽(或者连接到另外一个信号),他们的参数必须具有相同的顺序和相同的类型:

connect(ftp, SIGNAL(rawCommandReply(int, QString&)), this,  SLOT(processReply(int, QString&)));

如果参数类型不匹配,或者如果信号或槽不存在,则当应用程序使用调试模式构建后,qt会在运行时发出警告。如果在信号和槽的名字中包含了参数名,qt也会发出警告。


3、Qt类的构造函数,如在类GotoCellDialog中, QRetExpValidator qREV = new QRetExpValidator(regExp, this);//将参数this传递给QRegExpValidator的构造函数,使它成为GotoCellDialog对象的一个子对象。这样以后就不用担心有关删除QRegExpValidator的事情了:当删除它的父对象时,它也会被自动删除。

Qt的父子对象机制是在QObject中实现的。当利用一个父对象创建一个子对象(一个窗口部件、一个检查器或者是任意其他类型)时,父对象会把这个子对象添加到自己的子对象列表中。当删除这个父对象时,它会遍历子对量列表并且删除每一个子对象。然后这些子对象再去删除它们自己所包含的每个子对象。如此反复递归调用,直至清空所有子对象为止。这种父子对象机制可在很大程度上简化内存管理操作,降低内存泄露的风险。需要明确删除的对象是那些使用new创建出来的并且没有父对象的对象。并且,如果再删除一个父对象之前先删除了它的子对象,Qt会自动从它的父对象的子对象列表中将其移除。

对于窗口部件,父对象还有另外一层含义:子窗口部件会显示在它的父对象所在的区域中。当删除这个父窗口的部件时,不仅子对象会从内存中消失,而且它也会在屏幕上消失。


4、动态对话框

动态对话框就是在程序运行的时候使用的Qt设计师的.ui文件创建而来的那些对话框,动态对话框不需要通过uic将.ui文件转换成c++代码,相反,它是在程序运行时使用QUiLoader类载入该文件的,例如:

QUiLoader  uiLoader;

QFile  file("sortdialog.ui");

QWidget *sortDialog = uiLoader.load(&file);

if (sortDialog){

}

可以使用 QObject::findChild<T>()来访问这个窗体中的各个子窗口部件:

QComboBox * primaryCombo = sortDialog->findChild<QComboBox*> ("primaryCombo");

if (primaryCombo){

}

这里的findChild<T>()函数是一个模板成员函数,它可以返回与给定的名字和类型相匹配的子对象。

QUiLoader类放在一个独立的库中,为了在Qt应用程序中使用QUiLoader,必须在这个应用程序的.pro文件中加入这一行: CONFIG += uitools

动态对话框使得不重新编译应用程序而可以改变窗体布局。动态对话框也同样可用于创建小型终端应用程序,这些程序只有一个内置的前端窗体,并且只是在需要的时候才会去创建所有的其他窗体。


5、内置的窗口部件类和对话框类

Qt提供了一整套内置的窗口部件和常用对话框,这可以满足绝大多数情况。如 QMenuBar, QStatusBar, QToolBar ,QSplitter等。

Qt按钮有 QPushButton, QToolButton, QCheckButton, QRadioButton等四类。

Qt的容器窗口部件是一种可以包含其他窗口部件的窗口部件。QFrame也可以用于它自身,这只是为了画一条直线,它也可以用作许多其他窗口部件的基类,如QToolBox和QLabel。

QTabWidget和QToolBox是多页窗口部件。在多页窗口中,每一页都是一个子窗口部件,并从0开始编号这些页。对于一个QTabWidget,它的每一个Tab标签的形状和位置都可以设置。


6、图形用户界面程序通常会使用许多图片,为应用程序提供图片方法很多,常用的一种为:

(1)把图片保存到文件中,并且在运行时载入他们

(2)把XPM文件包含在源代码中(这一方法之所以可行,是因为XPM文件也是有效的C++文件)

(3)使用Qt的资源机制

Qt的资源机制方法比运行时载入文件更为方便,并且该方法适用于所支持的任意文件格式。为了使用Qt的资源系统,必须创建一个资源文件,并且在识别该资源文件的.pro文件中添加一行代码。  RESOURCES = spreadsheet.qrc

资源文件自身使用了XML形式,所有的资源文件都会被编译到应用程序的可执行文件中,因此并不会弄丢他们。当引用这些资源时,需要使用带路径前缀:/(冒号前缀)的形式。


7、创建菜单和工具栏

Qt通过“动作”(Action)的概念简化了有关菜单和工具栏的编程。一个动作就是一个可以添加到任意数量的菜单和工具栏上的项。在Qt中创建菜单和工具栏包括以下步骤:

(1)创建并且设置动作

(2)创建菜单栏并且把动作添加到菜单上

(3)创建工具栏并且把动作添加到工具栏上

    newAction = new QAction(tr("&New"), this);
    newAction->setIcon(":/images/new.png");
    newAction->setShortcut(QKeySequence::New);
    newAction->setStatusTip("Create a new spreadsheet file");
    connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));

8、任意Qt窗口部件都可以有一个与之相关的QActions列表,要为应用程序提供一个上下文菜单,可以将所需要的动作添加到该窗口部件中,并且将该窗口部件的上下文菜单策略设置为一个现实这些动作的上下文菜单。当用户在一个窗口部件上右键,或者键盘上按下一个与平台相关的按键时,就可以激活这些上下文菜单。

spreadsheet->addAction(cutAction);

spreadsheet->addAction(copyAction);

spreadsheet->addAction(pasteAction);

spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);

一种更为高级的提供上下文菜单的方法是重新实现QWidget::contextMenuEvent()函数,创建一个QMenu窗口部件,在其中添加那些动作,并且再对该窗口部件调用exec函数。


9、QMainWindow::statusBar()函数返回一个指向状态栏的指针【在第一次调用statusBar()函数的时候会创建状态栏】

void MainWindow::createStatusBar()
{
 
    locationLabel = new QLabel(" W999 ");		//先设定文本{最大情形,用于确定合适的大小}
    locationLabel->setAlignment(Qt::AlignHCenter);	//设置居中对齐
    locationLabel->setMinimumSize(locationLabel->sizeHint());	//设置合适的大小, sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值
 
    formulaLabel = new QLabel;
    formulaLabel->setIndent(3);				//设置缩进
 
    statusBar()->addWidget(locationLabel);	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值