This forum has been archived. All content is frozen. Please use KDE Discuss instead.

problema nella classe KListWidget

Tags: None
(comma "," separated)
paolo
Registered Member
Posts
4
Karma
0

problema nella classe KListWidget

Tue Dec 29, 2009 6:56 pm
Ciao a tutti!
come qualcuno ricorda, tempo fa avevo trovato un bug nella classe klistwidget di pykde4 e l'avevo segnalato sul vecchio forum: http://www.kde-it.org/e107_plugins/forum/forum_viewtopic.php?2345.

In questi giorni ho sperimentato col c++ e ho trovato che lo stesso difetto è presente nella stessa classe in c++, ma prima di aprire un bug su bugzilla, vorrei che qualcun altro me lo confermasse con una distribuzione diversa da ubuntu (quella che uso io).


Riassumo brevemente.

La classe KListWidget è «A variant of QListWidget that honors KDE's system-wide settings. Extends the functionality of QListWidget to honor the system wide settings for Single Click/Double Click mode». (tratto da http://api.kde.org/4.3-api/kdelibs-apidocs/kdeui/html/classKListWidget.html)

Il problema è che non fa quello che dovrebbe fare, cioè quando KDE è in modalità singolo clic, se fate CTRL-clic, l'item viene (giustamente) selezionato, ma il segnale di attivazione viene emesso! CTRL-clic non deve emettere il segnale.

Quando KDE è in modalità doppio clic, facendo doppio clic su un item, vengono emessi due segnali, cioè sul terminale viene stampato due volte "activated", invece che una volta sola, come dovrebbe essere. Inoltre se premo il tasto invio sull'item selezionato, non emette niente.

Ora, vorrei allegare i file sorgenti (1kb) da testare, ma mi sembra non si possa fare, quindi mi preparo a incollarli...

-----------------------------------------------------

file CMakeLists.txt

Code: Select all
project (tutorial2)

find_package(KDE4 REQUIRED)
include_directories(${KDE4_INCLUDES})

set(tutorial2_SRCS
  main.cpp
  mainwindow.cpp
)

kde4_add_executable(tutorial2 ${tutorial2_SRCS})
target_link_libraries(tutorial2 ${KDE4_KDEUI_LIBS})



-----------------------------------------------------

file main.cpp

Code: Select all
#include <KApplication>
#include <KAboutData>
#include <KCmdLineArgs>
#include <KLocale>

#include "mainwindow.h"

int main (int argc, char *argv[])
{
  KAboutData aboutData( "tutorial2", 0,
      ki18n("Tutorial 2"), "1.0",
      ki18n("A simple text area"),
      KAboutData::License_GPL,
      ki18n("Copyright (c) 2007 Developer") );
  KCmdLineArgs::init( argc, argv, &aboutData );

  KApplication app;

  MainWindow* window = new MainWindow();
  window->show();

  return app.exec();
}



-----------------------------------------------------

file mainwindow.cpp

Code: Select all
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : KMainWindow(parent)
{
  listWidget = new KListWidget();
  listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
  setCentralWidget(listWidget);

  QListWidgetItem * item0 = new QListWidgetItem("0");
  item0->setData(Qt::UserRole, QVariant(1));
  listWidget->insertItem(0, item0);

  QListWidgetItem * item1 = new QListWidgetItem("1");
  item1->setData(Qt::UserRole, QVariant(1));
  listWidget->insertItem(1, item1);

  QListWidgetItem * item2 = new QListWidgetItem("2");
  item2->setData(Qt::UserRole, QVariant(1));
  listWidget->insertItem(2, item2);

  connect(listWidget, SIGNAL(executed (QListWidgetItem *)), this, SLOT(stampa(QListWidgetItem*)));

}

#include <iostream>

void MainWindow::stampa(QListWidgetItem *item) {
  std::cout << "signal emitted!" << std::endl;
  std::cout << "button pressed: " << item->text().toStdString() << std::endl;
}



-----------------------------------------------------

file mainwindow.h

Code: Select all
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <KMainWindow>
#include <KListWidget>

class MainWindow : public KMainWindow
{
  Q_OBJECT

  public:
    MainWindow(QWidget *parent=0);

  private:
    KListWidget* listWidget;

  private slots:
    void stampa(QListWidgetItem *);

};

#endif

panda84
Moderator
Posts
376
Karma
1
OS
Purtroppo al momento sembra che non molti sviluppatori bazzichino questo forum. Il mio consiglio è quello di segnalare comunque il bug anche se non è stato testato anche in altre distribuzioni vista la dovizia di particolari che hai riportato; sarà poi il manutentore del codice relativo a verificare ed approfondire la cosa.


Usate il pulsante Accept this answer per marcare una discussione come risolta!
Blog - LUG - KDE - Lavoro
pinotree
KDE Developer
Posts
222
Karma
7
OS

Re: problema nella classe KListWidget

Fri Jan 15, 2010 10:59 pm
Pardon per il ritardo.
Sembra che qualcun altro in questo forum abbia avuto problemi simili: viewtopic.php?f=64&t=85088.


Pino Toscano
paolo
Registered Member
Posts
4
Karma
0
pinotree wrote:Pardon per il ritardo.

Tranquillo, nessun problema.

pinotree wrote:Sembra che qualcun altro in questo forum abbia avuto problemi simili: viewtopic.php?f=64&t=85088.

E la risposta che gli han dato non è la soluzione di tutti i mali, perché se imposta kde in modalità singolo clic, avrà qualche problemuccio anche con QListWidget. Chi è curioso si legga il thread qui: http://www.python-it.org/forum/index.php?topic=2756.0

In agosto, con l'aiuto dei ragazzi di python-it, ho informato quelli della trolltech, ma loro si son lavati le mani perché «This is controlled by the style, and none of our styles return true for SH_ItemView_ActivateItemOnSingleClick».

Quindi, dovrebbe essere un problema collegato a kde e, dopo aver verificato che KListWidget ha più problemi di QListWidget, io direi di fare un bug-report. Mi aiutate a essere il più chiaro possibile? Io scriverei così:



"KListWidget is a variant of QListWidget that honors KDE's system-wide settings. Extends the functionality of QListWidget to honor the system wide settings for Single Click/Double Click mode". (from http://api.kde.org/4.x-api/kdelibs-apid ... idget.html)
But when KDE is set on single-click mode (i.e. you have to click once in order to activate an item), if you want to select the item by pressing CTRL+click, the item gets selected but the signal "KListWidget::executed(QListWidgetItem * item)" is emitted. Selecting the item is not supposed to fire the signal.
When KDE is set un double-click mode (i.e. you have to click twice in order to activate an item), if you want to activate the item by pressing twice, the signal is emitted twice! In attachment, the code to reproduce this bug.




Inoltre, per quanto riguarda l'applicazione che soffre di questo bug, tra tutto l'elenco (sigh) di applicazioni, non ho trovato niente di meglio di «kdelibs - General kdelibs Problems». Che dite?


Bookmarks



Who is online

Registered users: Bing [Bot], claydoh, Google [Bot], rblackwell, sethaaaa, Sogou [Bot], Yahoo [Bot]