5

私はユニプロジェクトに取り組んでおり、私たちの目標は、選択したディレクトリ上のすべてのimg / video / movieファイルをスキャンし、データベースに保存して、整理された方法で(QTreeWidgetItemを使用して)shozするプログラムを作成することです。プログラムを使用すると、ファイルを読み取ったり、開いたりするなどの操作を実行できます。さて、問題は、ファイルの1つを右クリックして、ディレクトリを開く、ファイルを削除するなどの多くのオプションを含むメニューをポップアップしたいということです...

右クリックメニューの作り方がわかりません。QTは初めてです。これを作ってみました。

connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(openMenu(QTreeWidgetItem *, int)));

itemClickedメソッドを再定義しようとしましたが、それが右クリックであるかどうかを知る方法が見つからないようで、間違った方法で試している可能性があります。

私はこれからインスピレーションを得ました:

connect(treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(opennMusic(QTreeWidgetItem *, int)));

ダブルクリックで音楽ファイルを実行します。

より多くのコード部分が必要な場合は、私に知らせてください:)。

andyの最後のコメントの後で編集して、新しいコードを表示します。

#include "affichagemusique.h"  




    void AffichageMusique::lireMusique(QTreeWidgetItem *item, int column)
{

    if(item->text(6)!=NULL)
    {
    Phonon::MediaSource source(item->text(6));
    mediaObject->setCurrentSource(source);
    mediaObject->play();
    }
}    


    void AffichageMusique::vueArtiste()
{

    layout->removeWidget(treeWidget);
    treeWidget = new QTreeWidget();
    QAction* pOpenDir = new QAction(tr("Play music"),treeWidget );
    treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
    treeWidget->addAction(pOpenDir);

.......

}    
// later on on the code

    void AffichageMusique::pOpenDir()  
{

    QTreeWidget * treeWidget = new QTreeWidget();
    QTreeWidgetItem * QTreeWidgetI= treeWidget->currentItem();
    lireMusique(QTreeWidgetI, 6);
}    

QTreeWidgetを削除しても*treeWidget= new QTreeWidget(); 行が機能しません。右クリックするとメニューが表示されますが、PLayをクリックしても何も起こりません。

4

3 に答える 3

9

QWidgetクラスには、次のメソッドがあります。

void setContextMenuPolicy (Qt::ContextMenuPolicy policy) 

パラメーター:Qt :: ActionsContextMenuを使用(コードまたはQtDesignerで設定できます)。

次に、次のようなQMenuを作成できます。

QTreeWidget* pTreeWidget = new QTreeWidget();
QAction* pOpenFile = new QAction(tr("Open A File"), pContextMenu);

pTreeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
pTreeWidget->addAction(pTestCard);

メインウィンドウメニューなど、他のメニューでアクションを再利用できるので、これを使用すると便利です...

それが少し役立つことを願っています!

于 2010-01-25T16:43:42.423 に答える
1

まさにその場合のイベントハンドラがあります:QWidget::contextMenuEvent。特定のマウスキーを確認する必要がないという事実に加えて、これにより、ユーザーがキーボードを使用してコンテキストメニューを作成したり、ユーザーが作業している場合はまったく異なる方法を使用したりできるという利点もあります。他の手段でコンテキストメニューが要求されるプラットフォーム。

于 2010-01-25T16:45:22.793 に答える
1

次のQtの例を簡単に確認することもできます:http://qt.nokia.com/doc/4.6/phonon-qmusicplayer.html

ここにはツリーはありませんが、ウィンドウを初期化する方法、QTableWidgetを構築してデータを設定する方法、シグナル/スロットの使用方法を真剣に検討する必要があります。

また、この例からテストすることをお勧めします。ソースコードを取得し、右クリックを追加するように変更してみてください...ツリーの場合と同じように...完全に機能するようになると、通過するのに23秒かかることがわかります。テーブルからツリーウィジェットへ...

この例で問題が少ない場合はお知らせください...

編集:あなたがいくつかのコードを入れた後...

1)lireMusiqueには、使用されない列パラメーターがあります。
2)item-> text(6)は、NULLにすることのできないQStringを返します。itemはNULLになる可能性があるため、NULLの場合、item!= NULLをテストしないと、メソッドを入力するたびにクラッシュします。
3)vueArtisteで、ウィジェットを削除して再作成するのはなぜですか?私はいくつかのコードを見逃しているかもしれませんが...
4)あなたのメソッドpOpenDirは奇妙です...私はそれをonActOpenDirectoryTriggered()と名付けます。pOpenDirアクションのトリガー信号に正しく接続されていますか?
5)アクションをトリガーするたびに新しいQTreeWidgetを作成するのはなぜですか?新しいツリーの名前は、vueArtisteのtreeWidget変数と同じです。これらの2つの変数のスコープは同じではありませんが、名前は同じです。災害のレシピです!

..。

Qtによる1つか2つのモデル/ビューの例を読むことをお勧めします。それらは簡単で、うまくできていて、大いに役立ちます!

また、厳密な命名規則に従うことをお勧めします。これらは、多くのバグや迷惑な状況を回避するのに役立ちます...コードに言語を混在させることも避けます(フランス語を忘れ、どこでも英語を使用します)...つまり、試してみてくださいそしてあなたのコードでもっと一定になりなさい!

最後に、あなたはフランス語を母国語としているようですので、この本のようなQt4の本(フランス語で1冊目、英語で2冊目)を読むことをお勧めします。私はこれから始めました、それはあなたが必要とするすべてとはるかに多くを与えるでしょう!

于 2010-01-28T11:15:46.080 に答える