请教一个关于信号槽的问题

时间:2021-08-11 17:34:05
 我想通过点击viewpic这个按钮然后才显示图片,通过connect来实现,可是编译后提示QObject::connect: Incompatible sender/receiver arguments
        QPushButton::clicked() --> Contact::paintEvent(QPaintEvent*),而且不用我点击,图片就在窗体上显示出来来,各位大侠,小弟应该怎样修改呢?初学者的困惑啊。。
#include "contact.h"
#include <QDialog>
#include <QGridLayout>
#include <QFileDialog>
#include <QPushButton>
#include <QPainter>
Contact::Contact(QWidget *parent) :
    QWidget(parent)
{

    fileBtn=new QPushButton(tr("选择照片"));
    viewpic=new QPushButton(tr("显示照片"));
    fileLineEdit=new QLineEdit;
    mainLayout=new QGridLayout(this);
    mainLayout->addWidget(fileBtn,5,0);
    mainLayout->addWidget(fileLineEdit,5,1);
    mainLayout->addWidget(viewpic,6,0,1,1);
    mainLayout->setSizeConstraint(QLayout::SetFixedSize);

    connect(fileBtn,SIGNAL(clicked()),this,SLOT(showFile()));
    connect(viewpic,SIGNAL(clicked()),this,SLOT(paintEvent(QPaintEvent *)));


}
void Contact::showFile()
{

    QString s=QFileDialog::getOpenFileName(this,"OPEN","/","*.jpg");

   fileLineEdit->setText(s);
}
void Contact::paintEvent(QPaintEvent *)
{


       char path[]="/home/wangyaqing/Pictures/hui.jpg";
       QPainter painter(this);
       QPixmap pix;
       pix.load(path);
       painter.drawPixmap(0,0,500,500,pix);


}

3 个解决方案

#1


好好看看信号和槽的机制吧
connect(viewpic,SIGNAL(clicked()),this,SLOT(paintEvent(QPaintEvent *)));
这么写是不对滴,首先信号和槽函数参数类型要一致,就是类似int对int,不管是调用系统的还是自己定义的,首先参数类型要一致,clicked()是无参数的,你和(paintEvent(QPaintEvent *)连一开始就注定要报错。
其次connect中不能穿进去实际的参数,这个你倒是没犯,不过看你对信号和槽很不了解,以后估计也会犯这样的错误
给你个建议是可以写个pictureShow()槽函数,与clicked()相连,然后在该函数里写一个label,用这个label显示图片,一点击,就label->show();这样也是可以实现的,自己根据你的需要自己想想办法吧,好好看看信号和槽

#2


还有解决问题了记得结贴啊!!!最近回复的帖子都没有结贴的,很郁闷啊!!!

#3


 我是新手,不是很清楚必须要结贴呢,谢谢哈

#1


好好看看信号和槽的机制吧
connect(viewpic,SIGNAL(clicked()),this,SLOT(paintEvent(QPaintEvent *)));
这么写是不对滴,首先信号和槽函数参数类型要一致,就是类似int对int,不管是调用系统的还是自己定义的,首先参数类型要一致,clicked()是无参数的,你和(paintEvent(QPaintEvent *)连一开始就注定要报错。
其次connect中不能穿进去实际的参数,这个你倒是没犯,不过看你对信号和槽很不了解,以后估计也会犯这样的错误
给你个建议是可以写个pictureShow()槽函数,与clicked()相连,然后在该函数里写一个label,用这个label显示图片,一点击,就label->show();这样也是可以实现的,自己根据你的需要自己想想办法吧,好好看看信号和槽

#2


还有解决问题了记得结贴啊!!!最近回复的帖子都没有结贴的,很郁闷啊!!!

#3


 我是新手,不是很清楚必须要结贴呢,谢谢哈