2016-03-25 12 views
0

Bugünün yarısı gibi görünen QListWidget davranışı özelleştirme çözümlerini çözmeye çalışırken, bugünün yarısını daha fazla harcadım: farenin sol düğmesine basıldığında ve fare imlecini hareket ettirdiğinde, ListWidget içeriği kaydırılır ve seçim yapılır. fare imlecinin altında görünecek başka bir öğeye taşınır. Kaydırma ile tamamım, ancak tüm ardıl öğeleri seçmekten kaçınmak istiyorum çünkü bu, programımda zamanında çalışmaya neden oluyor. Sonunda, fare baskısında liste içeriğini saklamak ve hareket ettirmek istiyorum, ancak yalnızca doğrudan üzerine tıklayarak öğeleri seçiyorum. Sürükle-bırak bu liste için devre dışı bırakıldı (varsayılan davranış) ve olması gerekir; Açıkça devre dışı bırakmaya çalıştım: hiçbir değişiklik yok.QListWidget öğesindeki öğeleri otomatik olarak seç'i devre dışı bırak'ı tıklatın + sürükleyin

QListWidget, QListWidgetItem, QListView gibi Qt ile ilgili sınıflardaki tüm kullanılabilir belgeleri okudum, siz adlandırın! Bu widget'ların kaynak kodunu anlamayı denedim; ... StackOverflow ve Google kazılıp ama ne yazık ki hiçbir sonuç :(İşte

tüm QListWidget için ilgili kodudur: Tek seçim, fantezi bir şey:

QListWidget* categoryListWidget; 
... 
categoryListWidget = new QListWidget(); 
categoryListWidget->move(offsetX, offsetY); 
categoryListWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
categoryListWidget->setSelectionMode(QAbstractItemView::SingleSelection); 
categoryListWidget->setFocusPolicy(Qt::NoFocus); 
categoryListWidget->setStyleSheet(listQSS); 
... 
categoryListWidget->clear(); 
new QListWidgetItem(tr("1 - Sample Category 1"), categoryListWidget); 
new QListWidgetItem(tr("2 - Sample Category 2"), categoryListWidget); 
new QListWidgetItem(tr("3 - Sample Category 3 with a very long name"), categoryListWidget); 
new QListWidgetItem(tr("4 - Sample Category 4"), categoryListWidget); 

C++/Qt 5.5 her nasılsa alakalı olup olmadığını, hem . leftButton basıldığında alt sınıf QListWidget ve çocuk sınıf mouseMove olayları görmezden yapmak

Başlık: Win ve Mac platformları benzer davranışlar paylaşan aynı soruya stumbles kim uğruna

+0

Sorunlara neden olan olayı filtrelemek için eventFilter işlevini kullanmayı denediniz mi? – user3147395

+0

Hangi olayı kastediyorsunuz? Fare basın, mouseMove ve mouseRelease, klasik kombinasyon vardır. Davranışlarını (bulmayı başaramadığım) custmomize etmenin basit bir yolu varsa, kendi özel sürümüm olan ListWidget'ı yazmayı reddederim. Bundan önce, aynı ListWidget öğesine 4 farklı özelleştirmeyi yaptım, bunların tümü dokümanlar, örnekler, vb. Almak için her biri 2 saat gibi çekildi ve bir satır kodla sonuçlandı: bu bayrağı ayarlayın veya bu ayarı değiştirin. Gerçekten benzer bir şey bulmayı umuyorum. –

+0

Üzgünüz, bu davranışı uygulayacak bir bayrak bilmiyorum, ancak ListWidgets ile çok fazla deneyimim yok, bu yüzden bilmediğim bir bayrak olabilir. – user3147395

cevap

1

, işte çözümdür.

class QtListWidget: public QListWidget 
{ // QListWidget clone that suppresses item selection on mouse click+drag 
private: 
    bool mousePressed; 
public: 
    QtListWidget():QListWidget(), mousePressed(false) {} 
protected: 
    virtual void mousePressEvent(QMouseEvent *event); 
    virtual void mouseMoveEvent(QMouseEvent *event); 
    virtual void mouseReleaseEvent(QMouseEvent *event); 
}; 

Kaynak:

QtListWidget* categoryListWidget; 
// all original code above would still work as expected 
... 

doğru yapılması ister: İhtiyacınız kadar

////////////////////////////////////////////////////////////////////////// 
void QtListWidget::mousePressEvent(QMouseEvent *event){ 
// qDebug() << "QtListWidget::mousePressEvent"; 
    if(event->button() == Qt::LeftButton) 
     mousePressed = true; 
    QListWidget::mousePressEvent(event); 
} 

void QtListWidget::mouseMoveEvent(QMouseEvent *event){ 
// qDebug() << "QtListWidget::mouseMoveEvent"; 
    if(!mousePressed) // disable click+drag 
     QListWidget::mouseMoveEvent(event); 
} 

void QtListWidget::mouseReleaseEvent(QMouseEvent *event){ 
// qDebug() << "QtListWidget::mouseReleaseEvent"; 
    if(event->button() == Qt::LeftButton) 
     mousePressed = false; 
    QListWidget::mouseReleaseEvent(event); 
} 
////////////////////////////////////////////////////////////////////////// 

Kullanımı gibi birçok Liste Widgets için önemsiz mi? o zaman kendin yap! :)

0

Çözümünüz, benim için kaydırma kaydırdı. QListView kullanıyorum. QListView üstünün Yapıcıda

:: Bağlı yuvaya olarak

ui->listView->setSelectionMode(QAbstractItemView::NoSelection); 
connect(ui->listView, SIGNAL(clicked(QModelIndex)), this, SLOT(on_listview_clicked(QModelIndex))); 

:

on_listview_clicked(const QModelIndex &index) 
{ 
    if (index.isValid()) 
    { 
     ui->listView->selectionModel->select(index, QItemSelectionModel::Toggle | QItemSelectionModel::Rows); 

    } 
} 

Yani, sadece bir tıklama seçer Burada başka bir yolu.

İlgili konular