Qpushbutton - >来自QPushButton的点击信号无法启动插槽中的功能

时间:2013-11-26 13:25:52

标签: qt signals qpushbutton

我是伙计,
Qt版本5.1
我正在研究现有的qt项目,我无法理解为什么当我点击按钮时,它无法启动插槽中的功能

我想要做的是我的Qt应用程序连接到网络,并使用QTreewidget显示所有机器及其mac地址。这部分工作正常 我的嵌套任务是从上一步创建的QTree对象中选择mac-adrress,然后创建一个按钮以在该机器上启动升级过程。
以下是我的源代码

1)main.cpp

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Regular_Work w;
    w.show();
    return a.exec();
}

2)regular_work.cpp

Regular_Work::Regular_Work(QWidget *parent)
    : QMainWindow(parent),macAdd_tree_p_( 0 ), reg_upgrade_button_(0),
      box_table_p_( 0 ),
      udp_listner_p_( 0 )

{
    ui.setupUi(this);
    // Create the main view
    create_main_view( this, macAdd_tree_p_, box_table_p_ , reg_upgrade_button_);

    init(); // this function upgradels other signals and slots from other class to find the network and upgradel the slots which displays teh tree view of mac address connected to a network.

    create_menu_actions();
}
Regular_Work::~Regular_Work()
{

}

// this function is called from another slot when itemClicked signal is received from QTreeWidgetItem
void Regular_Work::set_reg_upgrade_button_visible( Regular_Work* main_p )
{
     QPushButton* reg_upgrade_button = new QPushButton ("Regular_upgradei");
     reg_upgrade_button->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ;
     QWidget* centralWidget = new QWidget( main_p );

     centralWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
     QHBoxLayout* layout = new QHBoxLayout(centralWidget);
     layout->addWidget( reg_upgrade_button_ );
     main_p->setCentralWidget(centralWidget);
     reg_upgrade_button->setVisible( true );
    connect(reg_upgrade_button, SIGNAL( clicked() ), main_p,  SLOT( start_Work( "start Work" ) ) ); // this is teh problem ?

} 
void Regular_Calibration::start_Work( const QString& error_message )
{
    QMessageBox::information( this, 
                              tr( "Push button works " ),
                              error_message );
}

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的问题在于您尝试在connect语句中传递参数值。这不起作用: -

SLOT( start_Work( "start Work" ) )

您需要做的是创建一个与clicked()信号的参数匹配的插槽。然后在该槽函数中,您可以调用start_Work(“start Work”)函数。这样的事情: -

class Regular_Work : public QMainWindow
{
    Q_OBJECT

    private:
        void start_Work(const QString&);

    private slots:
        void ReceiveButtonClicked();
};

void RegularWork::ReceivedButtonClicked()
{
    start_Work("start Work");
}

连接信号和插槽: -

connect(reg_upgrade_button, SIGNAL( clicked() ), main_p,  SLOT( ReceiveButtonClicked()));

如果您使用Qt 5,则可以使用新的连接语法: -

connect(reg_upgrade_button, &QPushButton::clicked, main_p, &RegularWork::ReceiveButtonClicked);

这样做的好处是可以告诉您编译时是否存在问题,以及指向函数的指针,因此您不需要为函数指定任何参数。