2013-02-15 26 views
0

我是Qt的新手,我试图连接cilicked信号o一个按钮和一个函数hile写一个plasmoid。我想用一个外部函数作为Plasma :: PushButton类型对象的公共,以便我可以使用它将它与点击信号连接起来?有了gtk,它就像在点击一样简单,但不是在qt中有一个简单的方法,在那里我们可以取消使用插槽的需要?在plasmoid中连接一个小部件的信号

#include "plasma-tutorial1.h" 
#include<string.h> 
#include <stdlib.h> 
#include <QGraphicsLinearLayout> 
#include <QPainter> 
#include <QFontMetrics> 
#include <QSizeF> 
#include <QTextEdit> 
#include <plasma/svg.h> 
#include <plasma/theme.h> 
#include <plasma/widgets/lineedit.h> 
#include <plasma/widgets/pushbutton.h> 
#include <plasma/widgets/textedit.h> 
//PlasmaTutorial1 mainf; 

themainfunction(int choice,Plasma::LineEdit *m_lineEdit, 
Plasma::TextEdit *m_displaytext) 
{ 
char buffer[100]; 
const char *inp=(const char *)malloc(sizeof(char)*100); 
QString input; 
input=m_lineEdit->text(); 
QByteArray byteArray = input.toUtf8(); 
inp = byteArray.constData(); 
char *expression; 
expression=(char *)malloc(sizeof(char)*100); 
strcpy(expression,"sudo apt-"); 

switch(choice) 
{ 
case 1:{ 
     strcat(expression,"get install "); 
     strcat(expression,inp); 
     break; 
     }; 
case 2:{ 
     strcat(expression,"get remove "); 
     strcat(expression,inp); 
     break; 
     }; 
case 3:{ 
     strcat(expression,"cache search "); 
     strcat(expression,inp); 
     break; 
     }; 
}; 
/* 
FILE* in; 
FILE* ptr=fopen("new.txt","w"); 
FILE *popen(); 
if(!(in = popen("cal","r"))) 
    {return;} 

    while(fgets(buffer, 100, in) != NULL) { 
*/ 
m_displaytext->append("yeah!"); 
// fprintf(ptr,"%s",buffer); 

      //} 
//pclose(in); 
//fclose(ptr); 
} 
PlasmaTutorial1::PlasmaTutorial1(QObject *parent, const QVariantList &args) 
    : Plasma::Applet(parent, args), 
    m_svg(this), 
    m_icon("document") 
{ 
    m_svg.setImagePath("widgets/background"); 
    // this will get us the standard applet background, for free! 
    setBackgroundHints(DefaultBackground); 
    resize(200, 200); 
} 


PlasmaTutorial1::~PlasmaTutorial1() 
{ 
    if (hasFailedToLaunch()) { 
     // Do some cleanup here 
    } else { 
     // Save settings 
    } 
} 

void PlasmaTutorial1::init() 
{ 

    /* // A small demonstration of the setFailedToLaunch function 
    if (m_icon.isNull()) { 
     setFailedToLaunch(true, "No world to say hello"); 
    }*/ 
Counter rt; 
    QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(this); 
    layout->setOrientation(Qt::Vertical); //so widgets will be stacked up/down 

    m_lineEdit = new Plasma::LineEdit(this); 
    m_lineEdit->setText("Enter the package name here"); 

    m_displaytext = new Plasma::TextEdit(this); 
    m_displaytext->setText("Terminal"); 

    m_installButton = new Plasma::PushButton(this); 
    m_installButton->setText("Install"); 
    connect(m_installButton, SIGNAL(clicked()),&rt,SLOT(themainfunction(1,m_lineEdit,m_displaytext))); 

    m_removeButton = new Plasma::PushButton(this); 
    m_removeButton->setText("Remove"); 
    // m_removeButton->clicked() 

    connect(m_removeButton, SIGNAL(clicked()),&rt,SLOT(themainfunction(2,m_lineEdit,m_displaytext))); 

    m_searchButton = new Plasma::PushButton(this); 
    m_searchButton->setText("Search"); 
    connect(m_searchButton, SIGNAL(clicked()),&rt,SLOT(themainfunction(3,m_lineEdit,m_displaytext))); 


    layout->addItem(m_lineEdit); 
    layout->addItem(m_installButton); 
    layout->addItem(m_removeButton); 
    layout->addItem(m_searchButton); 
    layout->addItem(m_displaytext); 
    m_displaytext->append("yo baby!");  
} 

/* 
void PlasmaTutorial1::paintInterface(QPainter *p, 
     const QStyleOptionGraphicsItem *option, const QRect &contentsRect) 
{ 
    p->setRenderHint(QPainter::SmoothPixmapTransform); 
    p->setRenderHint(QPainter::Antialiasing); 

    // Now we draw the applet, starting with our svg 
    m_svg.resize((int)contentsRect.width(), (int)contentsRect.height()); 
    m_svg.paint(p, (int)contentsRect.left(), (int)contentsRect.top()); 

    // We place the icon and text 
    p->drawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(),(int)contentsRect.width()-14)); 
    p->save(); 
    p->setPen(Qt::white); 
    p->drawText(contentsRect, 
       Qt::AlignBottom | Qt::AlignHCenter, 
       "Hello Plasmoid!"); 
    p->restore(); 
} 
*/ 
// This is the command that links your applet to the .desktop file 
K_EXPORT_PLASMA_APPLET(tutorial1, PlasmaTutorial1) 

#include "plasma-tutorial1.moc" 

说我想连接mainfunction()点击安装按钮的信号。我该怎么做?我怎样才能得到一个血浆类?

+0

如何提供一些代码并更具体地说明这个问题? 此外,阅读一些文档可能会有所帮助:http://doc.qt.digia.com/4.7-snapshot/signalsandslots.html – kfunk 2013-02-15 21:30:30

+0

当您有QStrings完成所有工作时,请停止执行这些C风格的字符串操作 - 你正在浪费你的时间,并可能在代码中引入错误。至于插槽,他们不这样工作。以kfunk指出的方式阅读文档 - 不能像这样传递参数,并且插槽不能成为免费功能。 – Mat 2013-02-16 09:07:38

+0

我如何从等离子体中的PushButton派生一个类。我尝试过,但遇到了很多错误。你能给我一种方法来做到这一点,以便我可以使用插槽功能吗? – mjnovice 2013-02-16 16:37:35

回答

0

我得到了错过的地方。我们不能将对象作为参数在槽功能中传递。现在它运行平稳。 thanx为所有您​​的答复。

+0

请将您的答案标记为正确答案。 – troyane 2013-03-06 11:46:25