QLISTWIDGETITEMを追加のデータでカスタマイズして保存します、どのように?

StackOverflow https://stackoverflow.com/questions/5868336

  •  28-10-2019
  •  | 
  •  

質問

QLISTWIDGETITEMには、アイコンとテキストの2つのデータが含まれています。そして、私はそれに別のQSTRINGを保存したいです。どのようにできるのか?これが私のテストコードです。listWidgetは、additemを呼び出すと何も表示しません。

そして、どのアイテムがクリックされているかをどうやって知ることができますか?スロット関数は「void on_listwidget_itemclicked(qlistwidgetitem* item)」です。明らかにパラメーターアイテムは親クラスです:qlistwidgetitem、subclass: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);
}
役に立ちましたか?

解決

QListWidgetItem メンバー関数があります

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

QVariant QListWidgetItem::data ( int role ) const

任意のデータを保存するため(を含む QString)。設定 role = Qt::UserRole (またはより高い値)。

他のヒント

クラスの階層を上下に移動するには、キャストを使用できます。この場合はdynamic_cast:

dynamic_cast<QListWidgetItem*>( your_item )

これを信号とスロットのパラメーターとして使用できます。これは、recieving関数に「ねえ、これはqlistwidgetitemのポインターだったので、そのように扱ってください!」

さらに情報を表示するには、代わりにqtablewidgetの使用を検討する必要があります。それはあなたの要件に合っていて、あなたがしたように「密輸」情報を迂回する必要はないと思います;-)

編集:

あなたのコメントへの応答として:

見て qtablewidgetitem. 。 qtablewidgetitemにはアイコンもあることがわかります:-)したがって、必要なことは、情報をいくつかのqtablewidgetitemsに分割することです。アイコン用、テキスト用のアイテム、別のテキスト用のアイテムと必要なアイテムがあります。

今、すべて ListWidgetの1つのアイテムとして以前に持っていたものです。ユーザーがどこかにクリックするとすぐに、信号を使用します cellClicked( int row, int column )row どの行がクリックされたかを教えてくれます。これで、クリックされている行があり、探している情報を取得できます。

ユーザーが4行をクリックしたとしましょう。各行には列があります。最初の列にはアイコンが含まれ、2番目の列には名前が含まれています。そして今、特別なもの:3番目の列にはIPが含まれていますが、 隠れた. 。使用することでそうすることができます hideColumn( int column ).

行4:[列0:アイコン|列1:名前|列2 :(非表示)IP

したがって、ユーザーが行をクリックするたびに、列番号2のIPを調べるだけです。

もちろん、必要なだけ多くのセルを追加できます...名前が付いた文字列、もう1つは説明が付いています...そして、最後の列はIPの隠された列です。

使用してグリッドを見えないようにすることもできます setShowGrid( false ). 。これで、すべての行が1つのアイテムである通常の情報の表示のように見えます。

:-)

編集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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top