1

i 伙计们,
Qt 版本 5.1
我正在处理现有的 qt 项目,但我不明白为什么当我单击按钮时,它无法在插槽中启动功能

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

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 );
}

非常感谢您的帮助

4

1 回答 1

1

您的问题在于您试图在连接语句中传递参数值。这是行不通的:-

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);

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

于 2013-11-26T13:30:54.003 回答