65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 KDevelop 3.5 进行 Qt 4 编程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (9投票s)

2008年10月2日

GPL3

7分钟阅读

viewsIcon

47544

downloadIcon

693

使用 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 模板。

Qt4WithKDevelop/projectConfigDialog.png

在应用程序创建过程中,您将被要求输入 Qt 4 构建工具的正确路径。

Qt4WithKDevelop/projectSettings.png

请注意,这些设置是针对 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 会根据您在设置应用程序时创建的信息来配置这些选项。

Qt4WithKDevelop/qtOptions.png

构建它,让它运行 QMake,然后运行它,您将得到一个漂亮的、类似记事本的应用程序。

Qt4WithKDevelop/defaultapp.png

修改项目

当您决定修改代码时,您会面临一个基本选择:是使用 GUI 实现工具开发应用程序,还是自己编写代码。我个人倾向于折衷处理,我经常使用 GUI 来生成基础代码,然后将其复制到我自己的文件中进行编辑(如果需要)。

如果您查看生成的项目,您会注意到用于演示代码的所有代码都在派生自 QMainWindow 的类中,该类将以您项目的名称命名。要添加一个 Widget 或任何其他基于 UI 的类,请使用 File -> New,然后是提供的对话框。

Qt4WithKDevelop/Addnew.png

要添加一个类,最好使用 Class Wizard。要使用一个小部件,只需在派生自 QMainWindow 的类的构造函数中调用 setCentralWidget

作为这个类的演示,我们将看一下 QTreeWidget 类。

QTreeWidget

QTreeWidget 是您基本的、文件管理器风格的树形小部件,几乎所有用过电脑的人都应该很熟悉。需要注意的是,这与 QTreeView 不同,因为 QTreeView 支持 Qt 的模型/视图架构,这是一个全新的项目,Qt 帮助中有大量相关信息,如果您有兴趣可以查看。QTreeWidget 的工作方式与熟悉 Windows 操作的用户习惯基本相同。

在这个演示中,我们将使用一个 MP3 播放器库列表的模拟,它看起来会是这样的:

Qt4WithKDevelop/demopic.png

要创建 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(设置为 truefalse)来轻松实现。

编辑

当涉及到编辑树中的条目时,您可以默认启用编辑。通过在 QTreeWidget 类中调用 setEditTriggers,我们没有默认的编辑模式,而是让用户明确要求编辑条目。这样,当用户不期望时,树就不会进入编辑模式。当用户点击“编辑条目”按钮时,我们调用:

treeWidget->openPersistentEditor( editItem );

这会在列零中为当前选中的条目打开持久编辑器。然后,当用户按下“编辑评分”按钮时,我们调用:

treeWidget->openPersistentEditor( editItem, 1 );

来打开评分的编辑器。这与大多数人习惯的编辑歌曲评分的方式不完全一样,但源代码中提供了一个 Qt 示例,名为 Star Delegate。

排序

排序也是示例应用程序中不完美的一个方面,因为如果您点击排序按钮,您会看到我们调用了以下代码:

treeWidget->sortByColumn( 0, Qt::AscendingOrder );

这将对列中的所有条目进行排序。如果我们是排序评分,那将是完美的,但因为我们正在排序艺术家和专辑,默认排序会包括歌曲标题,而在这种情况下,这不一定是我们想要的。

复选框

如果您曾经使用过 ITunes 应用程序,您就会知道每首歌曲旁边都有一个复选框,它基本上告诉应用程序是将歌曲包含在计算机上的播放列表中,还是用于移动收听。您可以通过选择“显示复选框”按钮在演示中看到这些,您将得到:

Qt4WithKDevelop/checkboxes.png

在这里,您可以看到我们只为歌曲添加了复选框。这是通过以下代码完成的:

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 );
    }
}

目前,这是通过调用单个 QTreeWidgetItemsetFlags 函数来完成的,但我并不惊讶,因为在未来的 Qt 更新中可能会提供 setCheckBox 函数。

结论

至此,我们对 QTreeWidget 的简要介绍以及如何在 KDE 3.5 上使用 Qt 4 进行编程的入门介绍就结束了。当然,在为 KDE 开发时,您是希望现在切换到 Qt 4 还是继续使用 3.5 代码库直到 KDevelop 4 版本发布,这完全取决于个人选择。

© . All rights reserved.