我是Qt编程的新手.我得到发出信号的悬念,并用一个插槽捕捉信号,但是可以将插槽作为常规方法调用吗?
例如,在以下代码段中:
class someClass{
..
..
//method
void emitsig1(int val)
{
emit sig1(val);
}
public signals:
void sig1(int a);
};
class someOtherClass{
..
..
public slots:
int onSig1(int a)
{
//some computation on a
return a;
}
};
int main(argc, char** argv){
..
..
someClass obj1 = new someClass();
someOtherClass obj2 = new someOtherClass();
int value = 10, result =0;
obj1.emitsig1(value);
QObject::connect(obj1, SIGNAL(sig1(int), obj2, SLOT(onSig1(int)));
int newvalue = 100;
//is it legal to do this, and if so, what value …Run Code Online (Sandbox Code Playgroud) 当对象名称,信号和插槽都在文本文件中指定时,如何连接2个对象的信号和插槽?
获取正确的对象名称不是问题,因为我可以轻松地遍历数组并将名称与文件中的位置进行比较,但必须有某种方式可以从文件中返回信号和插槽并在connect函数中使用它,如:
connect(rtnObj1(line),SIGNAL(rtnSignal(line)),rtnObj2(line),SLOT(rtnSlot(line)));
Run Code Online (Sandbox Code Playgroud)
其中rtn函数返回对象名称/信号/槽,"line"是文件中的当前QString行.
我所知道的唯一方法是通过对每个组合进行字面编码并将QStrings与if语句进行比较,但这将是非常繁琐的,因为组合的数量将非常高.
注意: 这里有一个简单的例子证明基本上是这个问题如何存在.
第1帧:4个QComboBoxes.第一个和第三个保持对象名称,第二个保持信号,第四个保持槽.每个项目当然都是这些列表中的QString.点击按钮会在文件中添加一个新行,写入从每个框中选择的文本.
第2帧:已经拥有所需的对象.读取文件时,它会将列表中定义的对象与已创建的对象进行匹配,并在文件描述时将它们连接起来.
基于文件保存的数据创建对象很容易,但是如何从文件创建/拉出信号和插槽?
编辑: 除非,是否能够像这样连接?
connect(objectA, "", objectB, "");
Run Code Online (Sandbox Code Playgroud)
因为我发现我的代码会像那样编译,但每当我尝试插入插槽或信号名称时,我只会收到如下错误:
QObject :: connect:使用SIGNAL宏绑定Tile :: clicked
我是处理QMainWindow的"Core"对象.
Core.h代码
class Core : public QObject
{
Q_OBJECT
public:
explicit Core(QObject *parent = 0);
~Core();
void appInit();
int getAuth();
public slots:
void appExit();
private slots:
void appMenuTriggered(QAction *action);
private:
void preInit();
MainWindow *mwnd;
};
Run Code Online (Sandbox Code Playgroud)
Core.cpp代码
Core::Core(QObject *parent) : QObject(parent)
{
qDebug() << "Core::Constructor called";
preInit();
}
Core::~Core()
{
delete mwnd;
qDebug() << "Core::Destructor called";
}
int Core::getAuth()
{
LoginDialog *login = new LoginDialog();
int r = login->exec();
delete login;
return r;
}
void Core::appExit() // connected to qapplication aboutToQuit …Run Code Online (Sandbox Code Playgroud) 以下代码有效:
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(myMemberFunction()));
Run Code Online (Sandbox Code Playgroud)
那另一个不:
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(this->myMemberFunction()));
Run Code Online (Sandbox Code Playgroud)
为什么?
我已经像这样定义了我的插槽:
void choixPoints:: prendpixel1(Pixel depart)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我想执行以下句子:
Pixel depart= picmou->define(); //definition of a pixel, well defined
connect(chp3, SIGNAL(clicked()), this, SLOT(prendpixel1(Pixel depart)));
Run Code Online (Sandbox Code Playgroud)
但是,当我执行时,我获得:
QObject::connect: No such slot choixPoints::prendpixel1(Pixel depart)
Run Code Online (Sandbox Code Playgroud)
为什么我的插槽没有工作?
我正在写一个游戏.通过滴答计时器应该工作这个插槽.
void game_process::animate_cell(MainWindow* m, const std::string& s, double x,double y, size_t i, size_t j, const std::string& step)
{
painter.begin(m);
std::string ss("C:\\Users\\Vardan\\GAmes_lines\\res\\red_" + step + ".png");
ss += s;
const char* p = ss.c_str();
QImage image(p);
RECT temp = cal
culate_cell_rect(i, j);
QRectF target(x, y, image.width(), image.height());
painter.drawImage(target, image);
painter.end();
m->update(x + temp.x0, y + temp.y0, 60, 60);
}
, that's it,
Run Code Online (Sandbox Code Playgroud)
QTimer*timer = new QTimer(this); connect(timer,SIGNAL(timeout()),this,SLOT(render_cell(MainWindow*m,const std :: string&s,double x,double y,size_t i,size_t j,const std :: string&step)) ); timer-> start();
但是你可以看到插槽比信号更多的参数,因此信号和插槽机制不起作用.该怎么办?这里鳕鱼 …
在MainWindow's title 中显示实际时间(Hh:mm:ss)的简单方法是什么?使用插槽和信号技术。
我在VS2013中写了一个简单的QT计算器.我用信号released()来拨打我的插槽,但是我的插槽无法工作.也许我的信号从未触发过.我是QT的新手,我不知道我做错了什么.
我的班级有这个属性:
class Calculator : public QMainWindow
{
Q_OBJECT
public:
Calculator(QWidget *parent = 0);
~Calculator();
private slots:
void Calculator::two();
private:
QLabel *lable;
QPushButton *two_button;
QString value;
QString total;
int fnum;
int snum;
bool addbool;
bool subtractbool;
bool multiplybool;
bool devidebool;
};
Run Code Online (Sandbox Code Playgroud)
这是我将信号连接到插槽的代码:
one_button = new QPushButton("2", this);
connect(two_button, SIGNAL(released()), this, SLOT(two()));
Run Code Online (Sandbox Code Playgroud)
我的插槽是
void Calculator::two()
{
value = value+"2";
lable->setText(value);
}
Run Code Online (Sandbox Code Playgroud)
我在我的插槽中放了一个断点,但它从未到达断点.
我在小部件和连接插槽中的继承方面存在一些问题.我创建了一个继承自的Widget QWidget.这是原型:
class WidgetParams : public QWidget
{
Q_OBJECT
public:
explicit WidgetParams(QWidget *parent = 0) : QWidget(parent){}
virtual bool paramChanged() = 0;
protected:
bool paramsChanged;
};
Run Code Online (Sandbox Code Playgroud)
然后我创建了派生类WidgetParams,例如WidgetParamsWindows:
class WidgetParamsWindows : public WidgetParams
{
public:
explicit WidgetParamsWindows(QWidget *parent = 0);
virtual bool paramChanged(){return paramsChanged;}
private:
QFormLayout *layout;
QSpinBox *svertical;
QSpinBox *shorizontal;
signals:
public slots:
void changeSomeParam(int value);
};
Run Code Online (Sandbox Code Playgroud)
在WidgetParamsWindows,我有一些QSpinBox,QPushButton等调整参数.
我像这样连接QSpinBoxin WidetParamsWindows:
connect(spinbox,SIGNAL(valueChanged(int)),this,SLOT(changeSomeParam(int));
Run Code Online (Sandbox Code Playgroud)
之后我创建了一个WidgetParamsWindows并将其放入一个列表中WidgetParams,以便 …
我有一个CLOS对象的插槽名称列表:
(DEFCLASS TRIAL-DATA (STANDARD-OBJECT)
((A-DATUM :ACCESSOR A-DATUM :INITARG :A-DATUM :INITFORM NIL)
(BOTH-DATA :ACCESSOR BOTH-DATA :INITARG :BOTH-DATA :INITFORM 0)
(CUMULATIVE-DATA :ACCESSOR CUMULATIVE-DATA :INITARG :CUMULATIVE-DATA :INITFORM NIL)
(NAME :ACCESSOR NAME :INITARG :NAME :INITFORM VALUE)))
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
Run Code Online (Sandbox Code Playgroud)
我可以读取这些插槽的值:
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
(funcall (symbol-function (nth 0 slot-lst)) td))
Run Code Online (Sandbox Code Playgroud)
==>无
但为什么我不能为这些插槽写新值?我的类试验数据定义是否应该为每个插槽创建一个访问器功能?
;; Should set the first slot, a-datum's, value to 42
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of …Run Code Online (Sandbox Code Playgroud) 据说,只有Common Lisp中的特殊变量才能解除绑定.对于所有词汇变量,默认值为nil.我认为类槽存在于封闭之类的东西中,但显然它们不存在.
如果我定义一个没有:initform参数的CLOS插槽(希望它们将被绑定nil)并且在创建实例时不提供值,我将获得一个带有未绑定插槽的实例.为什么会这样?这不方便.