点击一次pushButton会对相应的slot执行两次

分析原因:

1,使用了可视化设计器设计UI,(RAD方式是高效和协作的一种有效手段)

2,在设计器中设置了signal和slot

3,slot函数采用了on_对象名_signal名的规则或者在代码中显示connect了不是这种规则的函数

要查为什么触发两次,要打开ui文件对应的c++代码,里面有这么一句:

 QObject::connect(pushButton, SIGNAL(clicked()), QtApp1Class, SLOT(on_pushButton_clicked()));

这句代码产生是因为手工进行了signal和slot的设置,

并且该slot符合QT信号-槽默认的连接规则,所以相当与有两句

 QObject::connect(pushButton, SIGNAL(clicked()), QtApp1Class, SLOT(on_pushButton_clicked()));

即,这对信号-槽进行了两次连接,所以会点击一次pushButton会出现两次slot函数on_pushButton_clicked()的调用。

 

解决方案:

A:如果使用设计器进行信号-槽的连接,就要注意函数名不要使用QT默认连接规则,也不要再自行对信号和槽进行连接。

B:不采用设计器进行信号-槽连接,避免不同VS add-in的生成不同,QTCreater和VS add-in的生成规则不同,采用手工连接。

推荐采用手工连接方式。不会出现意想不到的问题。


Qt框架中,要实现点击一次QPushButton后绘制一个三角形,你可以使用以下步骤: 1. 创建一个继承自QWidget或者其子类(如QMainWindow或者QDialog)的自定义类。 2. 在自定义类中重写paintEvent事件处理函数,用于绘制图形。 3. 创建一个QPushButton对象,并将其点击信号与一个槽函数连接起来,在槽函数中调用自定义类的update()函数,触发重绘事件。 4. 在槽函数中,可以通过传递一个状态或者使用成员变量记录是否已经绘制过三角形。 以下是一个简单的代码示例: ```cpp #include <QWidget> #include <QPushButton> #include <QPainter> class TriangleWidget : public QWidget { public: TriangleWidget(QWidget *parent = nullptr) : QWidget(parent), triangleDrawn(false) {} protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); if (!triangleDrawn) { // 定义三个顶点 QPoint points[3] = { QPoint(50, 50), QPoint(100, 150), QPoint(150, 50) }; // 绘制三角形 painter.drawPolygon(points, 3); triangleDrawn = true; // 标记已绘制三角形 } } private: bool triangleDrawn; }; class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { // 创建按钮并设置其文本 QPushButton *button = new QPushButton("画三角形", this); // 连接按钮的clicked信号到槽函数 connect(button, &QPushButton::clicked, this, &MyWidget::drawTriangle); } private slots: void drawTriangle() { // 触发自定义widget的重绘 triangleWidget.update(); } private: TriangleWidget triangleWidget; }; #include "main.moc" int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget myWidget; myWidget.show(); return app.exec(); } ``` 在上述代码中,`TriangleWidget`是一个自定义的QWidget,它重写了`paintEvent`函数以绘制三角形。`MyWidget`类中有一个QPushButton和一个`TriangleWidget`实例。当按钮被点击时,`drawTriangle`槽函数被调用,触发`TriangleWidget`的重绘,从而绘制三角形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值