这是我第一次问堆栈溢出问题。如果您有任何问题的建议,请告诉我。
我对Qt很陌生,在使用事件时遇到一些问题。希望有人能提供任何想法。
背景:
我有我的自定义按钮,在rxPushButton
和rx.h
中是rx.cpp
。我使用on_rxPushButton_clicked
更改图像,并且效果很好。
在MainWindow
中,我需要使用一些rx
,所以我包含了类rx
,并且我想检测是否按下了鼠标左键,我需要知道按下了哪个rx
并记录其ID。在int
中的rxId
中。
问题:
我尝试了两种实现目标的方法,包括MainWindow
和mousePressEvent
。我发现我无法在任何eventFilter
上检测到鼠标按下的信号,但可以在rx
内其他位置的rx
之外检测到它。我想知道事件是否会发生冲突,但是当我在Mainwindow
中注释on_rxPushButton_clicked
时,rx.cpp
仍然无法解决该问题。因此,我假定MainWindow
占据的屏幕空间可能不会受到rx
的控制(我可以在我的代码中获得Debug消息“ test1”而不是“ test2”,请检查以下内容)。
如果我同时需要这两个东西(在MainWindow
中更改图像并在rx
中修改一个变量),应该如何解决该问题?又或者我的代码以及如何修改只是出问题了?
我希望将它们分开,因为将来我仍然需要在MainWindow
中包含许多对象。
这是我的一些相关代码:
rx.cpp
void rx::on_rxPushButton_clicked(void)
{
startLoading();
}
void rx::startLoading(void)
{
state = 1;
connect(timer, SIGNAL(timeout()), this, SLOT(loading1()));
timer->start(LOADING_INTERVAL);
}
void rx::loading1(void)
{
if(state == 1)
{
state = 2;
ui->rxPushButton->setStyleSheet("border-image: url(:/images/Rx/Rxloading1.png);");
disconnect(timer, SIGNAL(timeout()), this, SLOT(loading1()));
}
}
主窗口
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i = 0 ; i < rxSize ; i++)
{
rxList << new rx(this);
int j = i/rxHorizontalCount;
rxList[i]->setGeometry(500+(i-j*8)*110,10+j*90,100,90);
}
//rxList[0]->installEventFilter(this);
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
qDebug() << "test1";
if(rxList[0]->rect().contains(event->x(), event->y()))
qDebug() << "test2";
}
}
最佳答案
在RX中更改图像
使用QSignalMapper类捆绑来自QWidgets的信号(类rx),并使用与发送信号的对象相对应的widget参数(rx类)重新发出信号。
我们将每个按钮的clicked()信号连接到信号映射器的map()插槽,然后在信号映射器中创建从每个按钮到按钮本身的映射。
最后,我们将信号映射器的mapd()信号连接到自定义小部件的(rx对象)clicked()信号。当用户单击按钮时,自定义窗口小部件(rx对象)将发出一个clicked()信号,其参数为用户单击的按钮(rx对象)。
在MainWindow :: slotButtonsClicked(QWidget * p)函数中处理按钮单击事件。
在MainWindow中修改n变量:
您可以在mousePressEvent函数中更新MainWindow的变量
class MainWindow : public QWidget
{
public :
MainWindow (QWidget *parent);
QSignalMapper * mapper;
slots:
void slotButtonsClicked(QWidget *);
// ...
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mapper = new QSignalMapper(this);
for(int i = 0 ; i < rxSize ; i++)
{
rxList << new rx(this);
int j = i/rxHorizontalCount;
rxList[i]->setGeometry(500+(i-j*8)*110,10+j*90,100,90);
QObject::connect(rxList[i], SIGNAL(clicked()),mapper,SLOT(map()));
//Adds a mapping so that when map() is signalled from the sender, the signal mapped(widget ) is emitted.
mapper->setMapping(rxList[i], rxList[i]);
}
QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(slotButtonsClicked(QWidget *)));
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
qDebug() << "Clicked outside the button";
//Now you can modify n variable in MainWindow
}
MainWindow::mousePressEvent(event);
}
void MainWindow::slotButtonsClicked(QWidget *p)
{
rx *button = dynamic_cast<rx *>(p);
button->on_rxPushButton_clicked();
qDebug() << button <<" clicked on button";
//Now you can change image in rx
}
希望这有效:)
关于c++ - Qt-为什么我不能在MainWindow中为我的自定义按钮触发mousePressEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44650953/