在两个类之间连接QPushButton

时间:2018-06-21 07:10:49

标签: c++ qt c++11 qt5

我在Draw类的构造函数中的QGridLayout中有一个QListWidget.QGridLAyout包含其他元素。

Draw::Draw(QWidget *parent):QDialog(parent){

gridlayout=new QGridLayout;
gridlayout->addLayout(hbox,0,0);
gridlayout->addLayout(hbox1,1,0);
gridlayout->addLayout(hbox2,2,0);
gridlayout->addWidget(listWidget,3,0);
gridlayout->addLayout(hbox4,4,0);
this->setLayout(gridlayout);

}

单击QPushButton时。我正在调用一个填充QListWidget的插槽。

//插槽

void Draw::fillListWidget(){
//item is QListWidgetItem
item=new QListWidgetItem;
item->setSizeHint(QSize(0,50));
listWidget->addItem(item);
//WidgetfillListWidget is an other class with parameters for the QListWidget
listWidget->setItemWidget(item,new WidgetfillListWidget(label1,path));

}

在另一个类中,我将构建新的QWidget来填充QlistWidget。 QListWidget包含标签,字符串和QPushButton。

WidgetfillListWidget::WidgetfillListWidget(QString label, QString p){

instanceDraw=new Draw(this);
QString name = label;
QString path = p;

name1=new QLabel(name,this);
path1=new QLineEdit(path,this);
remove=new QPushButton("remove",this);

hboxlist=new QHBoxLayout;
hboxlist->addWidget(name1);
hboxlist->addWidget(path1);
hboxlist->addWidget(remove);

setLayout(hboxlist);
connect(remove,SIGNAL(clicked()),instanceDraw,SLOT(removeItem()));
}

在Draw类中,我有一个必须删除项目的插槽,但是它不起作用

void Draw::removeItem(){
listWidget->takeItem(listWidget->row(item));
}

删除项目无效。我认为它来自连接中的Draw对象。但是我不明白如何解决这个问题。有人有主意吗?

1 个答案:

答案 0 :(得分:0)

问题是因为在WidgetfillListWidget中创建的绘图与原始绘图不同,它们是2个不同的对象。

在这种情况下,解决方案是在WidgetfillListWidget中创建一个点击信号,该信号在按下QPushButton时发出。

然后将该信号连接到removeItem()方法。在其中我们必须获取商品,但这并不简单,一种实现方式是通过如下所示的几何位置:

widgetfilllistwidget.h

#ifndef WIDGETFILLLISTWIDGET_H
#define WIDGETFILLLISTWIDGET_H

#include <QWidget>

class QLabel;
class QPushButton;
class QHBoxLayout;
class QLineEdit;

class WidgetfillListWidget : public QWidget
{
    Q_OBJECT
public:
    explicit WidgetfillListWidget(const QString & name, const QString &path, QWidget *parent = nullptr);
signals:
    void clicked();
private:
    QLabel *lname;
    QLineEdit *lpath;
    QPushButton *premove;
    QHBoxLayout *hboxlist;
};

#endif // WIDGETFILLLISTWIDGET_H

widgetfilllistwidget.cpp

#include "widgetfilllistwidget.h"

#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>

WidgetfillListWidget::WidgetfillListWidget(const QString &name, const QString & path, QWidget *parent) : QWidget(parent)
{
    lname=new QLabel(name);
    lpath=new QLineEdit(path);
    premove=new QPushButton("remove");

    hboxlist=new QHBoxLayout(this);
    hboxlist->addWidget(lname);
    hboxlist->addWidget(lpath);
    hboxlist->addWidget(premove);
    connect(premove, &QPushButton::clicked, this, &WidgetfillListWidget::clicked);
}

draw.h

#ifndef DRAW_H
#define DRAW_H

#include <QDialog>

class QGridLayout;
class QListWidget;
class QPushButton;

class Draw : public QDialog
{
    Q_OBJECT

public:
    Draw(QWidget *parent = 0);
    ~Draw();
private:
    void fillListWidget();
    void removeItem();

    QGridLayout *gridlayout;
    QListWidget *listWidget;
    QPushButton *button;
};

#endif // DRAW_H

draw.cpp

#include "draw.h"
#include "widgetfilllistwidget.h"

#include <QGridLayout>
#include <QListWidget>
#include <QPushButton>

Draw::Draw(QWidget *parent)
    : QDialog(parent)
{
    button = new QPushButton("Press Me");
    listWidget = new QListWidget;
    gridlayout=new QGridLayout(this);
    gridlayout->addWidget(listWidget, 0, 0);
    gridlayout->addWidget(button, 1, 0);
    connect(button, &QPushButton::clicked, this, &Draw::fillListWidget);
}

void Draw::fillListWidget()
{
    QListWidgetItem *item=new QListWidgetItem;
    item->setSizeHint(QSize(0,50));
    listWidget->addItem(item);
    //WidgetfillListWidget is an other class with parameters for the QListWidget
    QString label = "label1";
    QString path = "label2";
    WidgetfillListWidget *widget = new WidgetfillListWidget(label,path);
    listWidget->setItemWidget(item, widget);
    connect(widget, &WidgetfillListWidget::clicked, this, &Draw::removeItem);
}

void Draw::removeItem()
{
    WidgetfillListWidget *widget = qobject_cast<WidgetfillListWidget *>(sender());
    if(widget){
        QPoint gp = widget->mapToGlobal(QPoint());
        QPoint p = listWidget->viewport()->mapFromGlobal(gp);
        QListWidgetItem *item = listWidget->itemAt(p);
        item = listWidget->takeItem(listWidget->row(item));
        delete item;
    }
}

Draw::~Draw()
{

}