【问题标题】:C++ - Adding item to QListWidget from QPushButtonC++ - 从 QPushButton 向 QListWidget 添加项目
【发布时间】:2014-02-02 15:35:25
【问题描述】:

您好,我正在尝试将项目从 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();

}

主窗口.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();

}

主窗口.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,我想知道如何在不使用设计器的情况下在代码中做到这一点。谢谢。

【问题讨论】:

    标签: c++ qt5


    【解决方案1】:

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

    将handleClick放在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 的构造函数,要么迭代窗口的控件。

    【讨论】:

    • 嘿巫毒教谢谢你的帮助。尝试了你所说的,但仍然是同样的错误。我已将原始帖子编辑为所做的更改。仍然可以正常编译,但是在运行应用程序时,控制台仍然返回相同的 slot not found 错误
    • 嘿巫毒再次感谢您的帮助。我对 Qt 的工作方式有点陌生。我还尝试将 QListWidget *ListWidget 设为全局,但由于多种原因,这不起作用。您介意做一个简短的伪代码来解释您提到的内容或将教程链接到此方法吗?
    • “将其传递给主窗口的构造函数”是否意味着将当前在我的主线程中的所有代码放入 ui(new Ui::MainWindow) 中?
    • 好吧,您需要对代码进行重大重组,为什么当您使用view.show(); 作为主窗口时还存在 MainWindow?您需要在MainWindow 的构造函数中移动与小部件构造有关的所有内容,并使用成员变量来保存您的控件。然后,您可以像往常一样从插槽访问控件。
    猜你喜欢
    • 2015-05-18
    • 2021-07-26
    • 2023-04-02
    • 2021-09-03
    • 2016-12-20
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多