C ++ - 从QPushButton向QListWidget添加项目

时间:2014-02-02 15:35:26

标签: c++ qt5

您好我正在尝试从QPushButton向QListWidget添加项目。 QListWidget和QPushButton都作为单独的小部件添加到QGraphicsScene中。我想要一个填充文本行的框的效果

main.c

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QGraphicsView view;

    QGraphicsScene *scene = new QGraphicsScene(0, 0, 1200, 1200, &view);

    scene->setBackgroundBrush(Qt::gray);

    view.setScene(scene);

    QPushButton *PushButton1;
    PushButton1 = new QPushButton();
    PushButton1->setGeometry(QRect(19, 20, 154, 4));

    QListWidget *ListWidget;
    ListWidget = new QListWidget;

    scene->addWidget(ListWidget);
    scene->addWidget(PushButton1);

    QObject::connect(PushButton1, SIGNAL(clicked()),&w, SLOT(handleClick(*QListWidget)));

    view.show();

    return a.exec();

}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::handleClick(QListWidget *List)
{
    int test;

    List->addItem("TESTING");

    //QApplication::quit();

}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidget>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;


    private slots:


    public slots:

        void handleClick(QListWidget *List);
};

#endif // MAINWINDOW_H

此代码编译良好。如何在应用程序运行时在控制台中收到以下错误

QObject::connect: No such slot MainWindow::handleClick(*ListWidget) in ..\MenuTest\main.cpp:48

有人可以帮我这么做吗?我已经看过几个教程,但它正在使用设计器来制作GUI,我想知道如何在不使用设计器的情况下在代码中完成。感谢。

1 个答案:

答案 0 :(得分:0)

您的插槽接受QListWidget,但您使用ListWidget作为参数连接,由于信号和插槽在Qt中的工作方式,签名必须完全匹配。

将句点放在public slots:下并更改此行:

QObject::connect(PushButton1, SIGNAL(clicked()),&w, SLOT(handleClick(*ListWidget)));

对此:

QObject::connect(PushButton1, SIGNAL(clicked()),&w, SLOT(handleClick(*QListWidget)));

更新

我看到我错过了一个关键点,签名必须匹配,如参数参数,所以那里的行不起作用。

要解决此问题,请完全删除该参数,因为PushButton1无法自动发送它。

QObject::connect(PushButton1, SIGNAL(clicked()),&w, SLOT(handleClick()));

此处也将其删除:

void MainWindow::handleClick()

要访问QListWidget,您必须直接引用它,方法是将其传递给MainWindow的构造函数或迭代窗口的控件。