使用 KDevelop 3.5 进行 Qt 4 编程






4.94/5 (9投票s)
使用 KDevelop 3.5 演示 QTreeWidget。
引言
对于这个项目,我们将使用 openSuse 11 来开发一些 Qt4 代码。您可以选择使用 KDE 4 或磁盘自带的 KDE 3.5 版本进行开发;只要您安装了 KDE4 和所需的库,这取决于您个人的偏好。就我个人而言,目前我仍然使用 KDE 3.5,因为 openSuse 11 附带的 KDE 4 版本有点像 Vista。
截至撰写本文时,使用最新版本的 KDevelop 3.5.2,您现在可以使用 Qt4 开发应用程序,这些应用程序与我们之前使用的“简单 KDE 应用程序”模板几乎相同。主要区别在于生成代码的位置,现在代码被放在 src 文件夹中,而不是 debug 文件夹中。因此,在使用 4.0 版本时,如果您创建一个名为 test widget 的小部件,编译后,会在源文件夹中创建一个名为 ui_testwidget.h 的文件来控制您小部件的绑定。
首先,我们需要创建应用程序。要做到这一点,请创建一个新项目,然后选择 Qt 4 Application 模板。
在应用程序创建过程中,您将被要求输入 Qt 4 构建工具的正确路径。
请注意,这些设置是针对 openSuse 的,所以对于其他 Linux 系统我无法保证。QMake 的路径是 usr/bin,Qt4 Designer 的路径是 usr/share/applications。
一旦您完成创建应用程序的过程,您将看到一个 README 文件,其中写着:
READ THIS IN ORDER TO COMPILE THE Qt4 TEMPLATE
----------------------------------------------
Before compiling, check the Qt Options, go to:
Project->Project Options->C++ Support and open the Qt Options tab.
Check that the Qt installation directory is correct for the Qt version you've chosen.
------------------
Andreas Pakulat
July 2006
仔细阅读此文件是一个非常好的主意,即使只是为了检查其准确性。KDevelop 会根据您在设置应用程序时创建的信息来配置这些选项。
构建它,让它运行 QMake,然后运行它,您将得到一个漂亮的、类似记事本的应用程序。
修改项目
当您决定修改代码时,您会面临一个基本选择:是使用 GUI 实现工具开发应用程序,还是自己编写代码。我个人倾向于折衷处理,我经常使用 GUI 来生成基础代码,然后将其复制到我自己的文件中进行编辑(如果需要)。
如果您查看生成的项目,您会注意到用于演示代码的所有代码都在派生自 QMainWindow
的类中,该类将以您项目的名称命名。要添加一个 Widget 或任何其他基于 UI 的类,请使用 File -> New,然后是提供的对话框。
要添加一个类,最好使用 Class Wizard。要使用一个小部件,只需在派生自 QMainWindow
的类的构造函数中调用 setCentralWidget
。
作为这个类的演示,我们将看一下 QTreeWidget
类。
QTreeWidget
QTreeWidget
是您基本的、文件管理器风格的树形小部件,几乎所有用过电脑的人都应该很熟悉。需要注意的是,这与 QTreeView
不同,因为 QTreeView
支持 Qt 的模型/视图架构,这是一个全新的项目,Qt 帮助中有大量相关信息,如果您有兴趣可以查看。QTreeWidget
的工作方式与熟悉 Windows 操作的用户习惯基本相同。
在这个演示中,我们将使用一个 MP3 播放器库列表的模拟,它看起来会是这样的:
要创建 QTreeWidget
,我们使用以下代码:
treeWidget = new QTreeWidget(widget);
treeWidget->setObjectName(QString::fromUtf8("treeWidget"));
treeWidget->setColumnCount( 2 );
treeWidget->headerItem()->setText( 0, QApplication::translate( "widget", "Library",
0, QApplication::UnicodeUTF8 ) );
treeWidget->headerItem()->setText( 1, QApplication::translate( "widget", "Rating",
0, QApplication::UnicodeUTF8 ) );
首先,我们创建小部件,其父级是我们将在应用程序中用作中央小部件的小部件。然后,我们设置列数,之后添加列标题详情。
添加条目
要向树形小部件添加条目,您首先需要创建将显示的信息的父项/项,在本例中是乐队,所以我们从这里开始:
QStringList ledZeppelinList( "Led Zeppelin" );
我们创建一个字符串列表来存储名称,然后调用:
QTreeWidgetItem *ledZeppelinItem =
new QTreeWidgetItem( treeWidget, ledZeppelinList );
这会创建 ledZeppelinItem
小部件并将其插入到我们的树视图中。这将是一个父项,因为我们将 treeWidget
本身设置为父项。
QStringList ledZeppelin3List( "Led Zeppelin III" );
QTreeWidgetItem *ledZeppelin3Item =
new QTreeWidgetItem( ledZeppelinItem, ledZeppelin3List );
要为 ledZeppelinItem
插入一个子项,在本例中是 Led Zeppelin 3 专辑,我们只需重复相同的序列,但将上面添加的 ledZeppelinItem
设置为父项。当我们添加歌曲时,这同样适用,我们将它们添加到 ledZeppelin3Item
。
当然,这只是设置了将在第一列显示的艺术家/专辑/歌曲数据。
如果您查看设置歌曲的代码,您会发现我以与上面完全相同的方式进行,代码是:
QStringList lz31List( "Immigrant Song" );
QStringList lz32List( "Friends" );
QTreeWidgetItem *lz31Item = new QTreeWidgetItem( ledZeppelin3Item, lz31List );
QTreeWidgetItem *lz32Item = new QTreeWidgetItem( ledZeppelin3Item, lz32List );
不同之处在于,之后,我们有了以下代码:
lz31Item->setText( 1, "***" );
lz32Item->setText( 1, "***" );
这会将第 1 列(从零开始)的文本设置为三个星号。
列和标题
一旦要显示的信息设置完毕,我们就可以关注列和标题了。应用程序的列和标题在创建树时使用以下代码进行设置:
treeWidget->setColumnCount( 2 );
treeWidget->headerItem()->setText( 0, QApplication::translate(
"Library", "Library", 0, QApplication::UnicodeUTF8 ) );
treeWidget->headerItem()->setText( 1, QApplication::translate(
"Rating", "Rating", 0, QApplication::UnicodeUTF8 ) );
在这里,您可以看到我们将列数设置为两个,然后调用 QTreeWidget::headerItem
函数来设置每个标题的文本,使用列号和文本。
添加完条目后,我们使用以下代码:
treeWidget->resizeColumnToContents( 0 );
treeWidget->resizeColumnToContents( 1 );
treeWidget->setHeaderHidden( false );
这会调整列的大小以显示数据,然后显示标题。显示和隐藏标题然后可以通过响应按钮点击并调用 setHeaderHidden
(设置为 true
或 false
)来轻松实现。
编辑
当涉及到编辑树中的条目时,您可以默认启用编辑。通过在 QTreeWidget
类中调用 setEditTriggers
,我们没有默认的编辑模式,而是让用户明确要求编辑条目。这样,当用户不期望时,树就不会进入编辑模式。当用户点击“编辑条目”按钮时,我们调用:
treeWidget->openPersistentEditor( editItem );
这会在列零中为当前选中的条目打开持久编辑器。然后,当用户按下“编辑评分”按钮时,我们调用:
treeWidget->openPersistentEditor( editItem, 1 );
来打开评分的编辑器。这与大多数人习惯的编辑歌曲评分的方式不完全一样,但源代码中提供了一个 Qt 示例,名为 Star Delegate。
排序
排序也是示例应用程序中不完美的一个方面,因为如果您点击排序按钮,您会看到我们调用了以下代码:
treeWidget->sortByColumn( 0, Qt::AscendingOrder );
这将对列中的所有条目进行排序。如果我们是排序评分,那将是完美的,但因为我们正在排序艺术家和专辑,默认排序会包括歌曲标题,而在这种情况下,这不一定是我们想要的。
复选框
如果您曾经使用过 ITunes 应用程序,您就会知道每首歌曲旁边都有一个复选框,它基本上告诉应用程序是将歌曲包含在计算机上的播放列表中,还是用于移动收听。您可以通过选择“显示复选框”按钮在演示中看到这些,您将得到:
在这里,您可以看到我们只为歌曲添加了复选框。这是通过以下代码完成的:
for( int n=0; n<nAlbumsCount; n++ )
{
QTreeWidgetItem *albumsWidget = artistWidget->child( n );
// albumsWidget->setFlags( Qt::ItemIsSelectable
// | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable );
// albumsWidget->setCheckState( 0, Qt::Unchecked );
int nSongsCount = albumsWidget->childCount();
for( int j=0; j<nSongsCount; j++ )
{
QTreeWidgetItem *songWidget = albumsWidget->child( j );
songWidget->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled
| Qt::ItemIsUserCheckable );
songWidget->setCheckState( 0, Qt::Checked );
}
}
目前,这是通过调用单个 QTreeWidgetItem
的 setFlags
函数来完成的,但我并不惊讶,因为在未来的 Qt 更新中可能会提供 setCheckBox
函数。
结论
至此,我们对 QTreeWidget
的简要介绍以及如何在 KDE 3.5 上使用 Qt 4 进行编程的入门介绍就结束了。当然,在为 KDE 开发时,您是希望现在切换到 Qt 4 还是继续使用 3.5 代码库直到 KDevelop 4 版本发布,这完全取决于个人选择。