【问题标题】:How to display in a QListWidget for each item of a QStringList a QLabel and another QString?如何在 QListWidget 中为 QStringList 的每个项目显示一个 QLabel 和另一个 QString?
【发布时间】:2018-06-25 17:03:17
【问题描述】:

我从文件夹中检索文件列表。 对于每个文件,我想输入它的日期(QString)和一个 QLabel。 对于每个文件,这三个元素将被放入 QListWidget。 我正确恢复了所有文件和日期。问题是这两个元素在两个不同的项目中。而且用这种方法,我不能把QLabel放在QListWidget中。

这是我的代码:

viewList.h:

class viewList : public QWidget{
Q_OBJECT

public:
viewList();
QString getDate();

private:
QGridLayout *gridlayout;
QHBoxLayout *hboxList;
QVBoxLayout *vboxlist;
QPushButton *button;
QLabel *myLabel;
QListWidget *listwidget;

};

viewList.cpp:

viewList::viewList(){

gridlayout=new QGridLayout;
vboxlist=new QVBoxLayout;
hboxList=new QHBoxLayout;
//Button is outside the list 
button=new QPushButton("test",this);
myLabel=new QLabel("ok",this);

QString path="/home/myFolder";
listwidget=new QListWidget;

foreach(QString file, files){
    listwidget->addItem(file);
    listwidget->addItem(getDate());
}
vboxlist->addWidget(listwidget);
gridlayout->addWidget(button,0,0,1,1);
gridlayout->addLayout(vboxlist,1,0,1,1);
this->setLayout(gridlayout);

}

QString viewList::getDate(){
  return QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
}

我的三个问题是,如果我做 listwidget-> addItem (myLabel) 它不起作用。此外,我想将文件和标签放在 QHBoxLayout 中,将 QHBoxLayout 放在 QVBoxLayout 中。但是用我的方法我做不到。最后,我希望 QLabel、QString(日期)和 QString(文件)在同一个项目中。

有人知道这样做的方法吗?现在我只在两个不同的项目中显示文件和日期。

【问题讨论】:

    标签: c++ qt c++11


    【解决方案1】:

    试试:

     QString widgetItem;
     widgetItem = file +" "+ getDate() +" "+ (label->text());
     listwidget->addItem(widgetItem);
    

    更新:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include<QDebug>
    #include<QHBoxLayout>
    #include<QWidget>
    #include<QLabel>
    
    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    
    void MainWindow::on_pushButton_clicked()
    {
    //Creating our widget for composing
    QWidget* window = new QWidget();
    //Creating a new label
    QLabel *label = new QLabel();
    label->setText("MyLable");
    label->setAlignment(Qt::AlignCenter);
     //Creating a new button for crowding
    QPushButton* button = new QPushButton("hey");
    
    //Creating a new list widget item whose parent is the listwidget itself
    QListWidgetItem* item;
    item = new QListWidgetItem(ui->listWidget);
    item->setSizeHint(QSize(0,30)); // you could change it
    
    //Creating layout for our label and etc...
    QHBoxLayout* layout = new QHBoxLayout();
    //Adding elements to layout
    layout->addWidget(label);
    layout->addWidget(button); // just for example
    layout->setAlignment(label,Qt::AlignCenter);
    layout->setAlignment(button,Qt::AlignCenter);
    layout->addStretch();
    window->setLayout(layout);
    
    //Adding the item to the listwidget
    ui->listWidget->addItem(item);
    
    ui->listWidget->setItemWidget(item,window);
    
    QString widgetText;
    QString fileName = "fileName";
    widgetText= fileName +" "+ "Date";
    
    item->setText(str);
    item->setTextAlignment(Qt::AlignRight|Qt::AlignCenter);
    
    //setting style for label in listWidget
    label->setStyleSheet("color: white; background: red;");
    

    } 当您单击按钮时,我会创建一个新项目。

    UPD2:

    QStringList files;
    files<<"file1"<<"file2"<<"file3";
    foreach (QString file, files) {
         QLabel *labelDate = new QLabel();
         QLabel *labelFile = new QLabel();
         QLabel *Mylabel = new QLabel();
         Mylabel->setText("Something");
         labelDate->setText("someDate");
         labelFile->setText(file);
         labelDate->setStyleSheet("color: white; background: red;");
         labelFile->setStyleSheet("color: white; background: red;");
         Mylabel->setStyleSheet  ("color: white; background: red;");
    
    
    QWidget* window = new QWidget();
    QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
    
    item->setSizeHint(QSize(0,30)); // you could change it
    
    //Creating layout for our label and etc...
    QHBoxLayout* layout = new QHBoxLayout();
    //Adding elements to layout
    layout->addWidget(labelDate);
    layout->addWidget(labelFile); // just for example
    layout->addWidget(Mylabel);
    layout->addStretch();
    window->setLayout(layout);
    ui->listWidget->addItem(item);
    ui->listWidget->setItemWidget(item,window);
    
    }
    

    【讨论】:

    • 感谢您的回答@Alexey Tsybin...它有效!!!但是 QLabel 样式表不显示是否可以显示它们?
    • 感谢您的更新回答,但没有出现任何内容,因为我这样做了:foreach(QString file, files){ labelName->setText(file); labelDate->setText(getDate()); listwidget->setItemWidget(item,labelName); listwidget->setItemWidget(item,labelDate); listwidget->setItemWidget(item,myLabel); listwidget->addItem(item);
    • 你需要将所有标签放到布局中:layout->addWidget(labelName),layout->addWidget(labelDate), layout->addWidget(MyLabel),layout->addStretch();然后将此布局添加到 QWidget 元素; QWidget *window = new QWidget();窗口 - 设置布局(布局);然后 listWidget -> addIetm(item); listWidget->setItemWidget(item,window)
    • 只有一个问题...循环 foreach 在 Mylabel->setStyleSheet ("color: white; background: red;"); 之后停止?
    • 不,在 ui->listWidget->setItemWidget(item,window);
    【解决方案2】:

    对于包含多个列的项目列表,我发现QTreeWidget 更适合。您只是不使用分层功能(所有条目都是 topLevelItems)。

    这具有表格模型的所有优点:每个字段的样式表、不同的基本 QVariant 类型、按列排序、嵌入图像等...

    使用QTableWidget 比较困难,因为每个字段都是不同的项目。

    【讨论】:

    • 感谢您的想法,但我不知道 QTreeWidget。我用 Alexey 的例子用 QListWidgetItem 和 QListWidget 实现了一个方法,但我没有看到我的整个列表。没有放置滚动条。
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多