2011-05-03 4 views
5

QListWidgetItem에는 아이콘과 텍스트의 두 가지 데이터가 포함되어 있습니다. 그리고 다른 QString을 저장하고 싶습니다. 어떻게해야합니까? 다음은 내 테스트 코드입니다. addItem을 호출하면 ListWidget에 아무 것도 표시되지 않습니다.저장할 QListWidgetItem을 추가 데이터로 사용자 지정하려면 어떻게합니까?

그리고 어떤 항목을 클릭했는지 어떻게 알 수 있습니까? SLOT 함수는 "void on_listWidget_itemClicked (QListWidgetItem * item)"입니다. 물론 매개 변수 항목은 부모 클래스는 다음과 같습니다 QListWidgetItem, NOT 서브 클래스 : ListWidgetItem

ListWidgetItem::ListWidgetItem(const QIcon &icon, const QString &text,QString &ip, QListWidget *parent, int type) 
{ 
    myip = ip; 
    QListWidgetItem::QListWidgetItem(icon,text,parent,type); 
} 

ListWidgetItem::~ListWidgetItem() 
{ 

} 

QVariant ListWidgetItem::data(int role) const 
{ 
    if (role==IPROLE) 
    { 
     return myip; 
    } 
    return QListWidgetItem::data(role); 
} 

void ListWidgetItem::setData(int role, const QVariant &value) 
{ 
    if (role==IPROLE) 
    { 
     myip = value.toString(); 
    } 
    QListWidgetItem::setData(role,value); 
} 

답변

7

QListWidgetItem은 (QString 포함)에 임의의 데이터를 저장하는 멤버 함수를

void QListWidgetItem::setData (int role, const QVariant & value) 

QVariant QListWidgetItem::data (int role) const 

있다. role = Qt::UserRole (또는 더 높은 값)을 설정하십시오.

6

당신이 캐스트를 사용할 수있는 클래스 계층 구조에서 아래로 이동,이 경우 dynamic_cast는에 :

dynamic_cast<QListWidgetItem*>(your_item) 

당신 이것을 신호 및 슬롯의 매개 변수로 사용할 수 있습니다. 이 함수는 "이봐 요, 이건 QListWidgetItem의 포인터이기 때문에 그렇게 취급하십시오!"라고 알려줄 것입니다.

그리고 더 많은 정보를 표시하려면 대신 QTableWidget 사용을 고려해야합니다. 그게 당신의 필요 조건에 맞는 것이라고 생각하고 당신은 당신이했던 것처럼 "밀수"정보를 통해 그 우회로를 갈 필요가 없습니다 것입니다 ;-)

편집 :

: 귀하의 코멘트에 대한 응답으로

QTableWidgetItem을보십시오. QTableWidgetItem도 아이콘을 가질 수 있습니다 .-) 그래서 당신이해야 할 일은 정보를 여러 개의 QTableWidgetItems로 나누는 것입니다. 아이콘에 대한 항목, 텍스트에 대한 항목 및 다른 텍스트에 대한 항목 및 필요한 항목이 있습니다.

이제 모든 은 이전에 ListWidget에서 하나의 항목으로 있었던 항목입니다. 이제 사용자가 어딘가를 클릭하자마자 cellClicked(int row, int column)row 신호를 사용하여 클릭 한 행을 알 수 있습니다. 이제 행을 클릭하여 찾고있는 정보를 얻을 수 있습니다.

사용자가 네 번째 행을 클릭한다고 가정 해 보겠습니다. 각 행에는 열이 있습니다. 첫 번째 열은 아이콘을 포함하고 두 번째 열은 이름을 포함합니다. 이제 특수한 것 : 세 번째 열에는 IP가 있지만 입니다. hideColumn(int column)을 사용하면됩니다.

행 4 : [열 0 : 아이콘 | 1 열 : 이름 | 열이 : (알 수 없음) IP]

그래서 매번 사용자가 행을 클릭, 당신은 단지 열 수있는 IP를 조회 2. 당신이 원하는대로 당신은 많은 셀을 추가 할 수 물론

... 한 이름이있는 문자열과 설명이있는 문자열이 들어 있습니다. 그리고 마지막으로 열은 IP가있는 숨겨진 열입니다.

setShowGrid(false)을 사용하여 눈금을 보이지 않게 할 수도 있습니다. 이제는 모든 행이 하나의 항목 인 일반적인 정보 표시처럼 보입니다.

:-)

편집 2 :

가 나는 작은 예제를 구현 무슨 뜻인지를 표시합니다. 아래 코드를 참조하십시오.

m_table_widget = new QTableWidget(4, 4, this); 

QTableWidgetItem* my_item_0 = new QTableWidgetItem("icon 1"); 
QTableWidgetItem* my_item_1 = new QTableWidgetItem("server 1"); 
QTableWidgetItem* my_item_2 = new QTableWidgetItem("this is server 1"); 
QTableWidgetItem* my_item_3 = new QTableWidgetItem("192.0.0.1"); 

QTableWidgetItem* my_item_4 = new QTableWidgetItem("icon 2"); 
QTableWidgetItem* my_item_5 = new QTableWidgetItem("server 2"); 
QTableWidgetItem* my_item_6 = new QTableWidgetItem("this is server 2"); 
QTableWidgetItem* my_item_7 = new QTableWidgetItem("192.0.0.2"); 

m_table_widget->setItem(0, 0, my_item_0); 
m_table_widget->setItem(0, 1, my_item_1); 
m_table_widget->setItem(0, 2, my_item_2); 
m_table_widget->setItem(0, 3, my_item_3); 

m_table_widget->setItem(1, 0, my_item_4); 
m_table_widget->setItem(1, 1, my_item_5); 
m_table_widget->setItem(1, 2, my_item_6); 
m_table_widget->setItem(1, 3, my_item_7); 

m_table_widget->hideColumn(3); 
m_table_widget->setShowGrid(false); 
m_table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); 
m_table_widget->verticalHeader()->hide(); 

QStringList list; 
list << "Icon" << "Name" << "Description" << "IP"; 
m_table_widget->setHorizontalHeaderLabels(list); 

connect(m_table_widget, SIGNAL(cellClicked(int,int)), this, SLOT(on_cell_clicked(int,int))); 

이제 수평 헤더가있는 표가 제공됩니다 (당연히 필요하지 않음). 행을 클릭하면, 전체 행을 선택하고 다음 슬롯이라고 :

void main_window::on_cell_clicked(int row, int column) 
{ 
    QString ip = m_table_widget->item(row, 3)->text(); 
    QMessageBox message(QMessageBox::Information, "Server Info", QString("This is row %1 and the IP is: %2").arg(row).arg(ip)); 

    message.exec(); 
} 

이 내가 빨리 썼다 ... 물론이 일을 더 나은 방법이있다 단순한 예이지만, 어쩌면 그것을 문제를 해결하는 데 도움이됩니다.

Example implementation in sandbox app

+0

감사합니다. 그러나 QTableWidget은 IconMode를 지원하지 않습니다. 나는 아래의 이름으로 아이콘을 표시하고 싶을 때, 클릭하면 앱이 내 정보의 항목 정보를 얻을 수있다. – catinred

+0

내 편집 된 게시물보기 :) – Exa

+0

예제 코드와 그림을 사용한 또 다른 편집. – Exa