Seite 1 von 1

[gelöst] Buttongröße ändern

Verfasst: 26. Januar 2010 14:56
von krone
Hallo zusammen,

ich benutze PushButtons als Balken eines Diagramms und würde diese gerne zur Laufzeit ändern bzw. die Breite der Buttons.

ich habe mich shcon mit setgeometry, update, updategeometry, setminsize, setmaxsize probiert aber kam zu keinem Erfolg.
Es gibt kein Layout in dem Widget, wo die Buttons angzeigt werden.

Ich hoffe mir kann jemand helfen

Verfasst: 26. Januar 2010 15:03
von franzf

Code: Alles auswählen

button.resize(newSize);
// edit:
oops, ist ja java, da gibts keinen operator->

Verfasst: 26. Januar 2010 15:42
von krone
hab ich auch schon probiert.

ging ebenfalls nicht

Verfasst: 26. Januar 2010 16:03
von franzf
Dann zeig bitte mehr Code. Denn ein nicht gelayouteter PushButton lässt sich ohne weiteres resize()en.

Verfasst: 26. Januar 2010 16:20
von krone

Code: Alles auswählen

public class ButtonBar extends QPushButton 

        private int width;
	private int height;
	private int x;
	private int y;
	private int placedVotesPerson;
	private int selectionID;
	private int pollID;
	private int place;
	private BarChart parent; [public class BarChart extends QWidget]

Code: Alles auswählen

/**
	 * Updates color and size of bar
	 */
	private void updateColorAndSize() {
		setGeometry(x, y + (place * 50), width, height);
		resize(width, height);

		// setFixedSize(width, height);
		/** set color of button */
		if (Data.getDataInstance().getListPoll(pollID).getHead()
				.isLimitValternative()
				&& DataManager.sumVotesPerAlternative(pollID, selectionID,
						Data.listType) >= Data.getDataInstance().getListPoll(
						pollID).getSelection(selectionID).getMaxPoints()) {
			// max number of votes per alternative is set and max number of
			// votes for this alternative reached
			setStyleSheet("background-color: red"); //$NON-NLS-1$
		} else if (Data.getDataInstance().getListPoll(pollID).getHead()
				.isLimitValternative()) {
			// max number of votes per alternative is set and max number of
			// votes for this alternative is not reached
			setStyleSheet("background-color: rgb(50,205,50)"); //$NON-NLS-1$
		} else if (placedVotesPerson == 0) {
			// limit for alternatives is not set and user did not voted for
			// alternative
			setStyleSheet("background-color: rgb(250,160,50)"); //$NON-NLS-1$
		} else if (placedVotesPerson > 0) {
			// limit for alternative is noet set and user voted for alternative
			setStyleSheet("background-color: rgb(30,144,255)"); //$NON-NLS-1$
		}
		if (data.getListPoll(pollID).getMembers().get(
				data.getListPoll(pollID).getMember(data.getUser().getUserID()))
				.getPoints() == -1)
			setStyleSheet("background-color: rgb(26,26,26)");

		update();
		updateGeometry();
	}

Code: Alles auswählen

/**
	 * draw bar
	 */
	@Override
	public void drawBar(QPainter painter) {
		// Draw Name of Alternative
		painter.setFont(new QFont("arial", 10)); //$NON-NLS-1$
		painter.setPen(QColor.black);
		painter.drawText(x + 5, y - 2 + (place * 50), getDescription());

		painter.drawRoundedRect(x, y + (place * 50) /* +(i*50) */, width,
				height, 10.0, 1.3);

		updateColorAndSize();

		// Draw Sum Votes for Alternative
		painter.setPen(QColor.darkCyan);
		painter.drawText(x + width + 5, y + height - 2 + (place * 50),
				"" + getSumVotes()); //$NON-NLS-1$

		parent.update();
		parent.updateGeometry();
	}

Die Größe width müsste eignetlich richtig sein, da wenn ich zusätzlich noch den button malen lasse, das richtige rauskommt. Nur der Button ändert seine Größe nicht.

Verfasst: 30. Januar 2010 11:51
von krone
Weiß niemand einen Rat für mich? :(

Beispielcode würde mich auch weiterbringen. Auch wenns nciht in java ist.

Verfasst: 31. Januar 2010 10:05
von franzf
Reduzier deinen Code, so dass du durchblickst ;)
Denn ein resize funktioniert absolut problemlos!

Code: Alles auswählen

#include <QWidget>
#include <QPushButton>
#include <QSlider>
#include <QVBoxLayout>
#include <QHBoxLayout>

class Widget : public QWidget
{
    Q_OBJECT
    QPushButton *btn;
public:
    Widget() {
        QWidget* view = new QWidget(this);
        
        btn = new QPushButton("Resize me!", view);
        
        QSlider *heightSlider = new QSlider(Qt::Horizontal, this);
        heightSlider->setMinimum(btn->height());
        heightSlider->setMaximum(btn->height()*4);

        QSlider *widthSlider = new QSlider(Qt::Horizontal, this);
        widthSlider->setMinimum(btn->width());
        widthSlider->setMaximum(btn->width()*4);
        
        QHBoxLayout* sliderLayout = new QHBoxLayout;
        sliderLayout->addWidget(heightSlider);
        sliderLayout->addWidget(widthSlider);
        
        QVBoxLayout *mainLayout = new QVBoxLayout(this);        
        mainLayout->addWidget(view);
        mainLayout->addLayout(sliderLayout);
        
        connect(heightSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeHeight(int)));
        connect(widthSlider, SIGNAL(sliderMoved(int)), this, SLOT(changeWidth(int)));
        
        resize(500, 200);
    }
    
public slots:
    void changeHeight(int val) {
        btn->resize(btn->width(), val);
    }
    void changeWidth(int val) {
        btn->resize(val, btn->height());
    }
};    
Ist C++, da ich hier kein QtJambi installiert hab. Das funktioniert problemlos.

Verfasst: 31. Januar 2010 15:54
von krone
Danke, ich habs jetzt hinbekommen