Fra*_*ank 2 qt signals sender slot
对于我的GUI,我希望有两对按钮可以在滚动条上下滚动.第一组按钮应该在说scrollarea1上工作,第二组按钮应该在scrollarea2上工作.我放在scrollarea中的小部件称为viewport1和viewport2.由于两组按钮都应该相同(向上和向下滚动),我想我会创建两个名为scrollUp和scrollDown的插槽来处理两组按钮的滚动.不幸的是,我无法完成这项工作,需要一些帮助.我尝试过以下方法:
QPushButton up;
QPushButton down;
QPushButton up2;
QPushButton down2;
connect(&up,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&up2,SIGNAL(clicked()),&up,SLOT(scrollUp()));
connect(&down,SIGNAL(clicked()),&down,SLOT(scrollDown()));
connect(&down2,SIGNAL(clicked()),&down,SLOT(scrollDown()));
void MainWindow::scrollDown()
{
QScrollArea area;
QWidget view;
if((QPushButton) &sender = down)
{
area=scrollArea;
view=viewport;
}
if((QPushButton) &sender = down2)
{
area=scrollArea;
view=viewport;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos+15);
int newpos = area.verticalScrollBar()->value();
QPoint topLeft = area.viewport()->rect().topLeft();
view.move(topLeft.x(),topLeft.y()-(newpos));
}
void MainWindow::scrollUp()
{
QScrollArea area;
QWidget view;
if((QPushButton) &sender = up)
{
area=scrollArea;
view=viewport;
}
if((QPushButton) &sender = up2)
{
area=scrollArea2;
view=viewport2;
}
int curpos = area.verticalScrollBar()->value();
area.verticalScrollBar()->setValue(curpos-15);
int newpos = area.verticalScrollBar()->value();
QPoint topLeft = area.viewport()->rect().topLeft();
view.move(topLeft.x(),topLeft.y()-(newpos));
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用有几个原因.我也尝试给插槽一些参数,例如:
connect(&up,SIGNAL(clicked()),&up,SLOT(scrollUp(scrollarea1,viewport1)));
connect(&up2,SIGNAL(clicked()),&up,SLOT(scrollUp(scrollarea2,viewport2)));
Run Code Online (Sandbox Code Playgroud)
但同样,没有成功.有谁能够帮我?
首先,"它不起作用"并不意味着什么,如果你没有说出你得到的错误,很难帮助你.然后,几乎没有问题.
所有QObject的派生类都不可复制,这意味着你无法做到
QWidget a;
QWidget b;
b = a; // Wrong
Run Code Online (Sandbox Code Playgroud)
你应该使用指针(或者可能是引用).
QWidget a;
QWidget * b = new QWidget(...);
QWidget * c;
c = & a; // Ok
c = b; // Ok
Run Code Online (Sandbox Code Playgroud)
那你的connect电话是错的:
connect(&up, SIGNAL(clicked()), &up, SLOT(scrollUp()));
Run Code Online (Sandbox Code Playgroud)
第三个参数是具有槽的对象.up是一个QPushButton,它没有scrollUp()插槽,你的MainWindow是谁:
connect(&up, SIGNAL(clicked()), this, SLOT(scrollUp()));
Run Code Online (Sandbox Code Playgroud)
(因为connect在MainWindow的构造函数中调用this指向当前的MainWindow对象).
同样在C++中,单=符号表示赋值,对于相等比较,使用=='. Andsender`是一个函数.
如果以正确的方式实施,您的方法应该有效:
class MainWindow: public QWidget
{
QScrollArea * scroll1;
QScrollArea * scroll2;
QWidget * view1;
QWidget * view2;
QPushButton * up1;
QPushButton * up2;
QPushButton * down1;
QPushButton * down2;
public:
MainWindow()
{
// Here initialize member variables.
...
connect(up1, SIGNAL(clicked()), this, SLOT(scrollUp()));
connect(up2, SIGNAL(clicked()), this, SLOT(scrollUp()));
connect(down1, SIGNAL(clicked()), this, SLOT(scrollDown()));
connect(down2, SIGNAL(clicked()), this, SLOT(scrollDown()));
}
public slots:
void scrollDown()
{
QScrollArea * area;
QWidget * view;
if(qobject_cast<QPushButton>(sender()) == down1) {
area = & scroll1;
view = & view1;
} else if(qobject_cast<QPushButton>(sender()) == down2) {
area = & scroll2;
view = & view2;
} else {
// Error.
}
// Now `area` and `view` point to the right widgets.
...
}
void scrollUp()
{
// The same as before.
}
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是将实际滚动指令提取到单独的函数:
class MainWindow: public QWidget
{
// Same variables as before
...
public:
MainWindow()
{
// Here initialize member variables.
...
connect(up1, SIGNAL(clicked()), this, SLOT(scrollUp1()));
connect(up2, SIGNAL(clicked()), this, SLOT(scrollUp2()));
connect(down1, SIGNAL(clicked()), this, SLOT(scrollDown1()));
connect(down2, SIGNAL(clicked()), this, SLOT(scrollDown2()));
}
public slots:
void scrollDown(QScrollArea * area, QWidget * view)
{
// Here you scroll over `area` and `view`.
}
void scrollDown1()
{
scrollDown(scroll1, area1);
}
void scrollDown2()
{
scrollDown(scroll2, area2);
}
// Again, the same for `scrollUp`.
};
Run Code Online (Sandbox Code Playgroud)
您的代码中存在多个错误:
QObject称为" sender"的方法QObject * QObject::sender() const;,而是一种在信号发送者上返回指针的方法.QPushButton**成QPushButton((QPushButton) &sender),你不要比较你的按钮那个东西up(2)和down(2).scrollUp和scrollDown插槽不属于QPushButton类,而是属于您的MainWindow类.最后,你应该写这样的东西:
connect(&up, SIGNAL(clicked()), this, SLOT(scrollUp()));
connect(&up2, SIGNAL(clicked()), this, SLOT(scrollUp()));
connect(&down, SIGNAL(clicked()), this, SLOT(scrollDown()));
connect(&down2, SIGNAL(clicked()), this, SLOT(scrollDown()));
void MainVindow::scrollDown() {
// [...]
QPushButton * senderButton = qobject_cast<QPushButton *>(this->sender());
// QPushButton * senderButton = (QPushButton *) this->sender(); works too
if (senderButton == &down) {
// [...]
}
if (senderButton == &down2) {
// [...]
}
// [...]
}
void MainVindow::scrollUp() {
// [...]
QPushButton * senderButton = qobject_cast<QPushButton *>(this->sender());
// QPushButton * senderButton = (QPushButton *) this->sender(); works too
if (senderButton == &up) {
// [...]
}
if (senderButton == &up2) {
// [...]
}
// [...]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8396 次 |
| 最近记录: |