Qt开发设置技巧

Qt在开发桌面客户端方面有很多方面做的很好,功能很强大,在免费并能跨平台的开发库里,做到了可以很好的满足一般客户端开发的需求。Qt库不光在界面上,而且在XML解析,JSON数据解析,网络通讯等各个功能点,都已经具备了好用的开发类库。Qt尤其在图形化处理方面有着自己很不一般的体验,和功能。

下面我结合我的开发经历,对Qt的一些功能点和用法进行一些小结,希望给开发者提供一些有用的帮助,共同学习。

(一) 自定义窗口的开发。

我们在开发项目中,经常需要开发一个视觉设计人员给定好的窗口,我们用Qt开发这样的窗口如图:

这样一个完全自定义的窗口,是如果使用Qt做出来的呢?首先我们需要好的视觉设计师提供配色好看的图片。作为客户端开发者来讲,好的视觉样式是给用户的第一感觉。

下面我就简述一下做一个这样的qt窗口的步骤,

1首先创建一个QWidget

2、托拽上去你需要的控件,这就是所见即所得的好处。

3、主窗口设置属性如下:

setWindowFlags(Qt::FramelessWindowHint);//去掉边框

setAttribute(Qt::WA_TranslucentBackground,true); //背景透明

setStyleSheet("QFrame{background: transparent; border: 0px solidwhite;}"); //背景透明

4、单个控件设置图片:

ui.label_Logo->setPixmap(QPixmap(":/Test/image/VDiskLogo.ico"));

这里的图片可以是png bmp ico 等

":/Test/image/VDiskLogo.ico"是图片的资源路径,这里给开发者详细介绍下:

文件路径是你建立的Qt工程中的.qrc文件里你添加这个图片文件之后拼出来的全路径。

还有一种方式就是Qt窗口样式表 如下

ui.label_Apply->setStyleSheet("QLabel{border-image:url(:/VdiskPCLit/image/setdlg/LitBt.png);border:1px}");

这个也可以达到设置控件图片以及样式的目的,Qt的样式表很强大,建议大家好好研究一下,可以为很多控件进行美化。这里不详细介绍 Qss,待以后专门找一个章节去介绍。大家先对此方法有个印象。

5、重载窗口的几个关键函数:

void mousePressEvent(QMouseEvent *e);

void mouseMoveEvent(QMouseEvent *e);

void mouseReleaseEvent(QMouseEvent *e);

void keyPressEvent ( QKeyEvent * event );

void showEvent(QShowEvent *evt);

相信用过Qt的同学对这几个Event已经比较熟悉,就不用我多介绍了。

这里着重说下bool eventFilter(QObject *target, QEvent*event);

这个eventFilter 就是父窗口对子控件的相应,比如鼠标点击,鼠标经过,鼠标释放等。

bool eventFilter(QObject *target, QEvent*event)

{

if (target == ui.label_CheckUseDefaultPath)//这里判断是否是需要响应的控件

{

if(event->type() ==QEvent::MouseButtonPress)//控件相应类型

{

}

}

}

这里有个问题,大家可能也遇到过,MouseButtonPress没有区分左键还是右键,这是Qt的一个Bug。

(二) 文件列表展示

我们做软件,经常会使用列表展示一些信息,例如文件列表,任务列表,人员信息列表等等需求。

这里介绍些Qt的列表控件:

QListView和QTreeView

这两个控件像是一对孪生兄弟,因为他们都继承于QAbstractItemView这个类,但各有各的特性,这就归功于面向对象的C++能让世界变得丰富多彩~呵呵。这里有点说多了,总之我们使用Qt的这两个列表的时候,可以找到他们的共性,和各自的差异点。

首先直观的看一下,各自的特点

QTreeWidget

QTreeView

QListView

QListView不能加Header这个是我对 Qt比较鄙视的地方。List本来就应该有列头,这里Qt没有做好,不知道以后的版本里面会不会加上。

而如果你需要带Header的列表,必须使用QTreeView.这个类。

Qt 中View的数据都是用Model控制的,典型的MVC设计模式。这里简单介绍下Model/view的关系

在model/view构架中,model为view和delegates使用数据提供了标准接口。在Qt中,标准接口QAbstractItemModel类中被定义。不管数据在底层以何种数据结构存储,QAabstractItemModel的子类会以层次结构的形式来表示数据,结构中包含了数据项表。我们按这种约定来访问model中的数据项,但这个约定不会对如何显示这些数据有任何限制。数据发生改变时,model通过信号槽机制来通知关联的views。

Model Indexes

为了使数据存储与数据访问分开,引入了model index的概念。通过modelindex,可以引用model中的数据项,Views和delegates都使用indexes来访问数据项,然后再显示出来。因此,只有model需要了解如何获取数据,被model管理的数据类型可以非常广泛地被定义。Modelindexes包含一个指向创建它们的model的指针,这会在配合多个model工作时避免混乱。

QAbstractItemModel *model = index.model();

modelindexes提供了对一项数据信息的临时引用,通过它可以访问或是修改model中的数据。既然model有时会重新组织内部的数据结构,这时modelindexes便会失效,因此不应该保存临时的modelindexes。假如需要一个对数据信息的长期的引用,那么应该创建一个persistent modelindex。这个引用会保持更新。临时的model indexes由QModelIndex提供,而具有持久能力的modelindexes则由QPersistentModelIndex提供。在获取对应一个数据项的modelindex时,需要考虑有关于model的三个属性:行数,列数,父项的model
index。

行与列

在最基本的形式中,一个model可作为一个简单的表来访问,每个数据项由行,列数来定位。这必不意味着

底层的数据用数组结构来存储。行和列的使用仅仅是一种约定,它允许组件之间相互通讯。可以通过指定

model中的行列数来获取任一项数据,可以得到与数据项一一对应的那个index。

QModelIndex index = model->index(row, column,...);

Model为简单的,单级的数据结构如list与tables提供了接口,它们如上面代码所显示的那样,不再需要别的信息被提供。当我们在获取一个modelindex时,我们需要提供另外的信息。

上图代表一个基本的table model,它的每一项用一对行列数来定位。通过行列数,可以获取代表一个数据项的modelindex .

QModelIndex indexA = model->index(0, 0,QModelIndex());

QModelIndex indexB =model->index(1, 1, QModelIndex());

QModelIndex indexC =model->index(2, 1, QModelIndex());

一个model的顶级项,由QModelIndex()取得,它们上式被用作父项。

父项

类似于表的接口在搭配使用table或list view时理想的,这种行列系统与view显示的方式是确切匹配的。

然则,像tree views这种结构需要model提供更为灵活的接口来访问数据项。每个数据项可能是别的项的

父项,上级的项可以获取下级项的列表。

当获取model中数据项的index时,我们必须指定关于数据项的父项的信息。在model外部,引用一个数据

项的唯一方法就是通过model index,因此需要在求取model index时指定父项的信息。

QModelIndex index = model->index(row, column,parent);

上图中,A项和C项作为model中顶层的兄弟项:

QModelIndex indexA =model->index(0, 0, QModelIndex());

QModelIndex indexC =model->index(2, 1, QModelIndex());

A有许多孩子,它的一个孩子B用以下代码获取:

QModelIndex indexB = model->index(1, 0,indexA);

项角色

model中的项可以作为各种角色来使用,这允许为不同的环境提供不同的数据。举例来说,Qt::DisplayRole被用于访问一个字符串,它作为文本会在view中显示。典型地,每个数据项都可以为许多不同的角色提供数据,标准的角色在Qt::ItemDataRole中定义。我们可以通过指定modelindex与角色来获取我们需要的数据:

QVariant value = model->data(index, role);

角色指出了从model中引用哪种类型的数据。views可以用不同的形式显示角色,因此为每个角色提供正确

的信息是非常重要的。通过为每个角色提供适当数据,model也为views和delegates提供了暗示,如何正确地

把这些数据项显给用户。不同的views可以自由地解析或忽略这些数据信息,对于特殊的场合,也可以定义

一些附加的角色。

概念总结:

1,Model indexes为views与delegages提供model中数据项定位的信息,它与底层的数据结构无关。

2,通过指定行,列数,父项的model index来引用数据项。

3,依照别的组件的要求,model indexes被model构建。

4,使用index()时,如果指定了有效的父项的model index,那么返回得到的modelindex对应于父项的某个孩子。

5,使用index()时,如果指定了无效的父项的model index,那么返回得到的modelindex对应于顶层项的某个孩子。

6, 角色对一个数据项包含的不同类型的数据给出了区分。

使用Model Indexes

QDirModel *model = new QDirModel;

QModelIndex parentIndex =model->index(QDir::currentPath());

int numRows = model->rowCount(parentIndex);

for (int row = 0; row < numRows;++row)

{

QModelIndex index = model->index(row, 0,parentIndex);

tring text = model->data(index,Qt::DisplayRole).toString();

// Display the text in a widget.

}

以上的例子说明了从model中获取数据的基本原则:

1,model的尺寸可以从rowCount()与columnCount()中得出。这些函数通常都需要一个表示父项的modelindex。

2,model indexes用来从model中访问数据项,数据项用行,列,父项model index定位。

3, 为了访问model顶层项,可以使用QModelIndex()指定。

4, 数据项为不同的角色提供不同的数据。为了获取数据,除了model index之外,还要指定角色。

这次对界面的使用上介绍的比较多,Qt的博大精深有很多需要去总结,以后对Qss等进行一些更详细的介绍,还有QXML等众多好用的功能。如果发现本人有对Qt总结不对的地方,请指正。

转自原文章地址

Qt开发设置技巧

时间: 2024-11-05 15:58:35

Qt开发设置技巧的相关文章

QT开发小技巧-窗口处理(一)

this->setWindowFlags(Qt::WindowCloseButtonHint); // 仅保留关闭按钮 this->setAttribute(Qt::WA_DeleteOnClose); // 关闭窗口自动释放资源 this->setWindowFlags(Qt::FramelessWindowHint); // 无边框 this->setWindowState( Qt::WindowFullScreen ); // 全屏 this->setWindowFla

Qt Creator 使用技巧

文章 由 flycarl 在 21 Dec 2010 创建 最后由 hamishwillee 在 13 Jun 2012 编辑 Contents 1 简介 2 代码浏览 2.1 定位器(locator) 3 代码编辑 4 断点调试 5 平台管理 6 项目管理 6.1 编译参数(Build) 6.2 运行参数(Run) 7 相关链接 简介 Qt Creator 作为Qt 开发的IDE,支持Qt 开发,及QML开发,能很好的发挥Qt 跨平台的特点,这里列举一些Qt Creator的使用技巧, Qt

【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽

Qt是一个跨平台的c++图形用户界面用用程序框架. Qt安装说明: windows下环境变量path需要加入以下路径,以便QT写的程序可以离开QT开发环境独立运行 C:\Qt\Qt5.2.0\5.2.0\mingw48_32\bin\;C:\Qt\Qt5.2.0\Tools\mingw48_32\bin; linux下需要设置.bash_profile文件 PATH中加入/opt/Qt5.2.0/5.2.0/gcc/bin 用root用户登录系统,进入/usr/lib目录后执行 ln libGL

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

QT开发(九)——QT单元组件

QT开发(九)--QT单元组件 QT有三种单元组件,分别为列表单元组件QListWidget.树形单元组件QTreeWidget.表格单元组件QTableWidget. 一.QListWidget列表单元 1.QListWidget组件简介 QListWidget列表单元组件继承自QListView,是基于单元的列表组件.QListWidget可以显示一个清单,清单中的每个项目是QListWidgetItem的一个实例,每个项目可以通过QListWidgetItem来操作.可以通过QListWi

QT开发(六十三)——QT事件机制分析

QT开发(六十三)--QT事件机制分析 一.事件机制 事件是由系统或者QT平台本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应时发出,如键盘事件等:另一些事件则是由系统自动发出,如计时器事件. 事件的出现,使得程序代码不会按照原始的线性顺序执行.线性顺序的程序设计风格不适合处理复杂的用户交互,如用户交互过程中,用户点击"打开文件"将开始执行打开文件的操作,用户点击"保存文件"将开始执

QT开发(二十)——QT对话框

QT开发(二十)--QT对话框 一.对话框简介 对话框是与用户进行简短交互的顶层窗口 QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget. QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中. 二.对话框类型 对话框类型分为模态对话框和非模态对话框. 1.模态对话框 模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用. 模态对话框一般在栈上创建

QT开发(二十七)——QT常用类(一)

QT开发(二十七)--QT常用类(一) 一.QString 1.QString简介 QString提供了Unicode编码的字符串,使用隐式共享技术来节省内存和不必要的数据拷贝,不必考虑跨平台的兼容性. QString类成员函数中除了 ascii().latin1().utf8().local8Bit()函数,其他所有的函数都是可重入的. 2.QString成员函数 QString::QString ( const QChar * unicode, int size ) QString::QSt